Как передать индекс ItemsSource как CommandParameter в WPF

В WPF: как я могу передать индекс цикла ItemsSource в качестве CommandParameter?

<ItemsControl ItemsSource="{Binding PageList}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button 
                Content="{Binding Name}"
                Command="{Binding DataContext.ChangePageCommand, ElementName=Window}"
                CommandParameter="INDEX OF ACTUAL ITEM AT ITEMSSOURCE GOES HERE" />
        </DataTemplate>
    </ItemsControl.ItemTemplate> 
</ItemsControl>

Итак, я хочу передать номер нажатой кнопки методу Command.

Благодарю вас!


person MorgoZ    schedule 17.12.2014    source источник
comment
Разве вы не можете использовать DataContext вашего предмета?   -  person Benjamin Diele    schedule 17.12.2014
comment
Не можете ли вы создать свойство в своей модели просмотра страниц, чтобы возвращать его индекс в родительской коллекции? то вы можете передать этот номер в свой параметр команды   -  person Krishna    schedule 17.12.2014


Ответы (1)


Простой способ сделать это.

Во-первых, винтовые индексы. Они сосут. Привязать к SelectedItem

<ItemsControl ItemsSource="{Binding PageList}" SelectedItem="{Binding SelectedPage}">

Теперь вам не нужно пытаться передать индекс в параметр, потому что выбранная страница уже находится в вашей ViewModel.

// set in the ctor
public ObservableCollection<Page> PageList {get;private set;}
// Omitting INPC stuff in the setter
public Page SelectedPage {get;set;}

// Here's the Execute method of the ICommand
private void ExecuteChangePageCommand(object parameter)
{
   // lol screw the parameter
   var currentPage = SelectedPage;
   UpdateSelectedPageOrDoWhateverLolKthx(currentPage);
}
person Community    schedule 17.12.2014
comment
В любом случае, я не ищу способ получить выбранную страницу, мне нужно знать кнопку, которая была нажата. Его позиция в списке и использование DataContext не вариант, так как каждый элемент не знает свою позицию в списке. - person MorgoZ; 17.12.2014
comment
@MorgoZ ах бля. Я привык использовать ListBox. Что касается позиции в списке, то она кажется очень странной. Почему ViewModel заботится о позиции элемента в пользовательском интерфейсе? Обычный шаблон: пользователь что-то выбирает, пользователь работает над чем-то, пользователь говорит виртуальной машине что-то сделать с этим чем-то. Для чего вы используете индекс? - person ; 17.12.2014