ItemsControl кнопка, нажав кнопку - PullRequest
10 голосов
/ 15 марта 2012

Мне нужна быстрая помощь, которая сейчас является для меня препятствием. У меня Button в ItemsControl, и мне нужно выполнить какую-то задачу при нажатии кнопки. Я попытался добавить Command к Button в I temsControl 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. И это не работает. Пожалуйста, предложите какое-нибудь решение для меня, чтобы продолжить

Ответы [ 4 ]

17 голосов
/ 15 марта 2012

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

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

<Button Command="{Binding 
    RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}, 
    Path=DataContext.MyCommand}" />
0 голосов
/ 15 марта 2012

Читать это:

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

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

0 голосов
/ 15 марта 2012

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

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

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

0 голосов
/ 15 марта 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);
  }
}
...