Команда нажатия кнопки ItemsControl

Мне нужна срочная помощь, которая сейчас мне мешает. У меня есть Button в ItemsControl, и мне нужно выполнить какую-то задачу при нажатии кнопки. Я пытался добавить Command к Button в ItemsControl DataTemplate, но это не сработало. Может кто подскажет как быть дальше.

<UserControl.Resources>
    <DataTemplate x:key="mytask">
        <TextBox Grid.Row="5" Grid.Column="2" Text="{Binding Path=PriorNote}" Grid.ColumnSpan="7"  VerticalAlignment="Center" HorizontalAlignment="Left" Margin="0,5" Width="505" Foreground="Black"/>
        <StatusBarItem Grid.Row="2" Grid.Column="8" Margin="8,7,7,8" Grid.RowSpan="2">
        <Button x:Name="DetailsButton" Command="{Binding CommandDetailsButtonClick}">
    </DataTemplate>
</UserControl.Resources>

<Grid>
    <ItemsControl Grid.Row="1" 
                  ItemsSource="{Binding ListStpRules}" 
                  ItemTemplate="{StaticResource myTaskTemplate}" Background="Black"
                  AlternationCount="2" >
    </ItemsControl>
</Grid>

а в ViewModel я реализовал код для Command. И это не работает. Пожалуйста, предложите мне любое решение, чтобы продолжить


person user1095239    schedule 15.03.2012    source источник


Ответы (4)


DataContext каждого элемента в вашем ItemsControl — это элемент в коллекции, к которому привязан ItemsControl. Если этот элемент содержит Command, ваш код должен работать нормально.

Однако обычно это не так. Обычно существует ViewModel, содержащая ObservableCollection элементов для ItemsControl и команду для выполнения. Если это ваш случай, вам нужно изменить Source вашей привязки, чтобы она искала команду в ItemsControl.DataContext, а не ItemsControl.Item[X]

<Button Command="{Binding 
    RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}, 
    Path=DataContext.MyCommand}" />
person Rachel    schedule 15.03.2012
comment
В дополнение к хорошему ответу Рэйчел, если вы хотите передать элемент в качестве параметра, используйте CommandParameter={Binding}... - person isntn; 03.06.2012
comment
+1 Это отлично сработало для меня! На самом деле мне нужно было привязываться к Command в представлении, а не к ViewModel, поэтому вместо этого я использовал: {Binding RelativeSource={RelativeSource AncestorType={x:Type UserControl}}, Path=MyCommand} =] - person newfurniturey; 14.08.2012

Если ваша ViewModel имеет свойство типа ICommand, вы можете привязать к нему свойство Button Command:

XAML:

<DataTemplate DataType="{x:Type my:FooViewModel}">
   <Button Content="Click!" Command="{Binding Path=DoBarCommand}" />
</DataTemplate>

C#:

public sealed class FooViewModel
{
  public ICommand DoBarCommand
  {
    get;
    private set;
  }
  //...
  public FooViewModel()
  {
     this.DoBarCommand = new DelegateCommand(this.CanDoBar, this.DoBar);
  }
}
person Matthias    schedule 15.03.2012

Прочитайте это:

http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

Реализуйте класс, аналогичный RelayCommand в статье выше. Упростит ваше дальнейшее кодирование MVVM. :-)

person Sreedharlal B Naick    schedule 15.03.2012

Просто предположение. Определен ли CommandDetailsButtonClick в ViewModel, который является DataContext вашего UserControl (тот, у которого есть свойство ListStpRules)?

DataContext кнопки в ItemTemplate является элементом из ListStpRules, и если вашей команды там нет, то привязка не найдет его.

Вы можете проверить диагностические сообщения от wpf в окне вывода во время отладки приложения. Пишет туда, если не может разрешить привязку.

person Nikolay    schedule 15.03.2012