Команды для элементов в ItemsControl

486
04 января 2017, 00:52

В программе используется несколько ItemsControl с переопределенным стилем, элементы которых кнопки, которые делают примерно одно и то же: по клику на кнопку, выбранный элемент должен удаляться из коллекции, привязанной к ItemsSource.

Из-за того, что привязываются разные коллекции, то для каждого ItemsControl я делаю свою команду удаления. И каждый ItemsControl у меня выглядит примерно так:

 <ItemsControl ItemsSource="{Binding MyCollection}" >
    <ItemsControl.Style>
        <Style TargetType="{x:Type ItemsControl}" BasedOn="{StaticResource ItemsControlMainStyle}">
            <Setter Property="ItemContainerStyle">
                <Setter.Value>
                    <Style TargetType="ContentPresenter">
                        <Setter Property="ContentTemplate">
                            <Setter.Value>
                                <DataTemplate>
                                    <Button Content="{Binding}" 
                                            Command="{Binding ElementName=mainWindow, Path=DataContext.OperationsVM.RemoveElementCommand}" />
                                </DataTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </Setter.Value>
            </Setter>
        </Style>
    </ItemsControl.Style>
</ItemsControl>    

То есть я дополняю основной стиль ItemsControlMainStyle и привязываю нужную команду. Код получается очень громоздкий. Интуитивно кажется, что можно сделать все более лаконично и этот кусок кода со стилем и привязкой команд вынести в ItemsControlMainStyle, а нужную команду забирать уже из свойства. Но вот с реализацией такого подхода у меня проблемы, ведь у ItemsControl нет свойства Command.

Подскажите, как такое сделать (и можно ли)?

Answer 1

ViewModel подключена в XAML

<Window.DataContext>
    <local:MainViewModel />
</Window.DataContext>

Список с кнопками такой

 <ListBox Height="284" Canvas.Left="135" Canvas.Top="27" Width="186"
             ItemsSource="{Binding StrList}" >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal" Margin="5">
                    <TextBlock Text="{Binding Mode=OneWay}" />
                    <Button
                        FontFamily="Segoe UI Symbol"
                        FontSize="12" Content="&#xE106;"
                        Margin="10,0"
                        Command="{Binding DataContext.DeleteCountryCommand, ElementName=window}"
                        CommandParameter="{Binding Mode=OneWay}"/>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

Во ViewModel

свойство для списка

private ObservableCollection<string> _StrList;
    public ObservableCollection<string> StrList
    {
        get { return _StrList; }
        set
        {
            _StrList = value;
            PropertyChanged(this, new PropertyChangedEventArgs(nameof(StrList)));
        }
    }

Команда для удаления

private RelayCommand<string> _DeleteCountryCommand;
    public RelayCommand<string> DeleteCountryCommand
    {
        get { return _DeleteCountryCommand = _DeleteCountryCommand ??
                new RelayCommand<string>(OnDeleteCountry, CanDeleteCountry); }
    }
    private bool CanDeleteCountry(string arg)
    {
        return true;
    }
    private void OnDeleteCountry(string obj)
    {
        StrList.Remove(obj);
    }
READ ALSO
Информация про клавиатуру и мышь C#

Информация про клавиатуру и мышь C#

Здравствуйте! Задача сделать аналог AIDA или Speccy, но более упрощенныйДелаю на С#, Windows Forms используя Environment, реестр и DriveInfo

573
Поиск в бд Sqlite кириллицы. C#

Поиск в бд Sqlite кириллицы. C#

Проблема такая: в бд все ищется очень хорошо, пока это английский, но на русском не ищет вообще ничегоДаже если учитывать регистр и даже если...

515
Рефакторинг программы

Рефакторинг программы

Я написал программу,которая рандомным образом выбирает глагол на русском языке из текстового документа и показывает нам егоЗадача пользователя...

444
Несколько коллекций на одном Canvas

Несколько коллекций на одном Canvas

Нужно отобразить несколько коллекций на одном Canvas'еСейчас сделано так - объединил ObservableCollection's в CompositeCollection и в xaml:

444