2016-03-14 3 views
3

Как бы добавить команду к кнопке wpf, которая является частью ItemsControl, и сама модифицирует ItemsSource?Как добавить ту же команду к кнопкам WPF в ItemsControl

Так вот мой XAML:

<ItemsControl ItemsSource="{Binding PluginVMs}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <Button x:Name="btnStampDuplicate" 
         Content="Duplicate this control" 
         Command="{Binding ?????????}"/> 
       <!-- other stuff --> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

А вот мой ViewModel:

public ObservableCollection<PluginViewModel> PluginVMs 
{ 
    get { return _pluginVMs; } 
    set 
    { 
     if (_pluginVMs != value) 
     { 
      _pluginVMs = value; 
      NotifyPropertyChanged("PluginVMs"); 
     } 
    } 
} 

Как вы можете видеть PluginVMs является сбор PluginViewModel. Поэтому я знаю, что команда, доступная из btnStampDuplicate, должна быть реализована внутри PluginViewModel.

Однако, как следует из названия дубликата, я хотел бы сделать дублированную копию созданного в настоящее время PluginViewModel внутри PluginVMs. Каков наилучший подход для предоставления такой функциональности btnStampDuplicate?

ответ

3

Нет необходимости иметь команду в каждом элементе. Вы можете использовать CommandParameter передать элемент, который является источником боян

внутри DataTemplate команды связывания с использованием ELEMENTNAME для доступа к DataContext более высокого уровня

Посмотреть

<ItemsControl Name="ListPlugins" ItemsSource="{Binding PluginVMs}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <Button x:Name="btnStampDuplicate" 
         Content="duplicate" 
         CommandParameter={Binding Path=.} 
         Command="{Binding Path=DataContext.DupeCmd, ElementName=ListPlugins}" 
       /> 
       <!-- other stuff --> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

ViewModel

public class Vm 
{ 
    public ObservableCollection<PluginViewModel> PluginVMs 
    { 
     get { return _pluginVMs; } 
     set 
     { 
      if (_pluginVMs != value) 
      { 
       _pluginVMs = value; 
       NotifyPropertyChanged("PluginVMs"); 
      } 
     } 
    } 

    public ICommand DupeCmd { get; private set; } 
} 
+0

Wow ElementName потрясающе! Я буду играть с ним! –

+1

@ publicst119, согласился :) проверить другой трюк - RelativeSource - http://stackoverflow.com/a/12360603/1506454 – ASh

+0

Это тоже классно! –

Смежные вопросы