В программе используется несколько 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
.
Подскажите, как такое сделать (и можно ли)?
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=""
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);
}
Здравствуйте! Задача сделать аналог AIDA или Speccy, но более упрощенныйДелаю на С#, Windows Forms используя Environment, реестр и DriveInfo
Проблема такая: в бд все ищется очень хорошо, пока это английский, но на русском не ищет вообще ничегоДаже если учитывать регистр и даже если...
Я написал программу,которая рандомным образом выбирает глагол на русском языке из текстового документа и показывает нам егоЗадача пользователя...
Нужно отобразить несколько коллекций на одном Canvas'еСейчас сделано так - объединил ObservableCollection's в CompositeCollection и в xaml: