Das sieht an sich schon mal ganz gut aus. So wie du das beschreibst, würde das auch mit den Boolean-Properties im ViewModel funktionieren. Ist wahrscheinlich nicht die schönste Lösung, da du für jeden Toggle eine Property benötigst und das if-else Konstrukt unschön wird, aber würde definitiv funktionieren. Dein Code müsste dann in etwa so aussehen:
<Window.DataContext>
<vm:UserViewModel/>
</Window.DataContext>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ListBox x:Name="LeftBox" Grid.Column="0" Margin="5" ItemsSource="{Binding DataList}">
</ListBox>
<ListBox x:Name="RightBox" Grid.Column="1" Margin="5" ItemsSource="{Binding FiltererdDataList}">
</ListBox>
<StackPanel Grid.Column="2">
<Button x:Name="Start" Content="Start" Height="30" Width="90" Margin="5" Command="{Binding StartAppCommand}">
</Button>
<ToggleButton x:Name="ABCD" Content="ABCD" Height="30" Width="90" IsChecked="{Binding ABCDToggleState}"
Command="{Binding FilterDataCommand}" CommandParameter="ABCD">
</ToggleButton>
<ToggleButton x:Name="EFGH" Content="EFGH" Height="30" Width="90" IsChecked="{Binding EFGHToggleState}"
Command="{Binding FilterDataCommand}" CommandParameter="EFGH">
</ToggleButton>
<ToggleButton x:Name="IJKL" Content="IJKL" Height="30" Width="90" IsChecked="{Binding IJKLToggleState}"
Command="{Binding FilterDataCommand}" CommandParameter="IJKL">
</ToggleButton>
<ToggleButton x:Name="MNOP" Content="MNOP" Height="30" Width="90" IsChecked="{Binding MNOPToggleState}"
Command="{Binding FilterDataCommand}" CommandParameter="MNOP">
</ToggleButton>
</StackPanel>
</Grid>
</Window>
internal class UserViewModel : NotifyPropertyChanged
{
public UserViewModel()
{
StartAppCommand = new RelayCommand((parameter) => StartApp());
FilterDataCommand = new RelayCommand((parameter) =>
{
string x = (string) parameter;
FilterData(x);
});
}
public ObservableCollection<FileInfo> DataList { get; set; } = new ObservableCollection<FileInfo>();
public ObservableCollection<FileInfo> FiltererdDataList { get; set; } = new ObservableCollection<FileInfo>();
public bool ABCDToggleState { get; set; }
public bool EFGHToggleState { get; set; }
public bool IJKLToggleState { get; set; }
public bool MNOPToggleState { get; set; }
public RelayCommand StartAppCommand { get; set; }
public RelayCommand FilterDataCommand { get; set; }
public RelayCommand RemoveDataCommand { get; set; }
public void GetData()
{
}
private void FilterData(string x)
{
ObservableCollection<FileInfo> NewList = new ObservableCollection<FileInfo>();
if (x == "ABCD" && ABCDToggleState)
{
NewList = FilterManager.AddData(DataList, FilterLibrary.FilterFile, x);
}
else if (x == "ABCD" && !ABCDToggleState)
{
FilterManager.RemoveData(FiltererdDataList, FilterLibrary.FilterFile, x);
}
//Hier dann noch weitere if/else Zweige für die anderen 3-ToggleButtons hinzufügen
foreach(FileInfo file in NewList)
{
FiltererdDataList.Add(file);
}
}
Persönlich würde ich das wahrscheinlich über die https://github.com/microsoft/XamlBehaviorsWpf Library umsetzen (Import über NuGet). Hier kannst du dann bei verschiedenen Events des ToggleButtons verschiedene Funktionen ausführen. Somit könnte man sich das if-else-Konstrukt sparen und auch die neuen Boolean-Properties würden wegfallen. Beispiel, wenn du die Library unter dem Alias 'i' im XAML-File eingebunden hast:
<ToggleButton>
<i:Interaction.Triggers>
<i:EventTrigger EventName="Unchecked">
<i:InvokeCommandAction Command="TODO: Uncheck-Command ausführen"
CommandParameter="TogglePARAM"/>
</i:EventTrigger>
<i:EventTrigger EventName="Checked">
<i:InvokeCommandAction Command="TODO: Check-Command ausführen"
CommandParameter="TogglePARAM"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</ToggleButton>
Eine dritte Option wäre, dass du den aktuellen State des ToggleButton mit ins VM übergibst. Dafür müsstest du aber einen MultiValueConverter schreiben, welcher dir zwei Eingaben in z.B. einen Tupel für das VM konvertiert. Praktisch der ToggleState und der ToggleControl-Name. Ist vermutlich bisschen aufwändiger. Hier wird das mit dem Multiconverter aber gut beschrieben: https://stackoverflow.com/questions/1350598/passing-two-command-parameters-using-a-wpf-binding