Zum Inhalt springen

eatenbaog

Mitglieder
  • Gesamte Inhalte

    3
  • Benutzer seit

  • Letzter Besuch

  1. eatenbaog

    ToggleButton und MVVM

    Ich persönlich nutze ToggleButtons meist nur, um irgendwelche Properties meiner Entitäten auf True/False zu stellen. Alternativ so wie du schreibst, um irgendwelche Einstellungen im Bezug auf die UI auf True/False zu stellen. Eventuell würde einfach ein anderes Control für deinen Use-Case mehr Sinn machen, das kann ich dir aber vermutlich nicht beantworten, da ich deine Anwendung im Detail ja nicht kenne.
  2. eatenbaog

    ToggleButton und MVVM

    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
  3. eatenbaog

    ToggleButton und MVVM

    Hi @Gewinde ich arbeite schon länger mit WPF, bin mir aber nicht ganz sicher, ob ich dein Problem richtig verstehe. Vielleicht könntest du noch etwas Code mit deinem derzeitigen Ansatz bzw. deiner derzeitigen Lösung ergänzen. In meinem Verständnis könntest du einfach bei deinen ToggleButtons den Command auf ein Command deines ViewModels binden und dort dann, je nachdem welcher ToggleButton geklickt wurde, dynamisch deinen FileName deiner Datei per CommandParameter übergeben. Das gebindete Command im ViewModel würde dann mit deinem übergebenem FileName entsprechend deinen Code ausführen. Hier ein Beispiel (wobei mir nicht ganz klar ist, wofür du die IsChecked-Property benötigst, deshalb habe ich die rausgelassen). WPF-Code (Hier könntest du ggfs. die FileNames-Property deiner Liste auch auf den CommandParameter binden, anstatt wie ich hier einen festen Parameter definieren.) : <ToggleButton Command="{Binding TestCommand}" CommandParameter="Test"> </ToggleButton> C# ViewModel-Code: private ICommand _testCommand; public ICommand TestCommand { get { _testCommand ??= new RelayCommand(param => testFunc(param as string)); return _testCommand; } } public void testFunc(string fileName) { Console.WriteLine(fileName); }

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...