2016-04-04 9 views
1

habe ich ein ziemlich komplexes Objektmodell Objekte benutzerdefinierte Sammlung verschachtelt haben/Modelle wie unten dargestellt:WPF Listview Multiselektion mit benutzerdefinierten CheckBox innerhalb

public sealed class LibraryInfo : NamedModel 
{  
    public ClassInfos _classes;  
    public ClassInfos Classes 
    { 
     get { return _classes; } 
     set { SetProperty(ref _classes, value); } 
    } 
} 

public class ClassInfos : List<ClassInfo> { } 

public sealed class ClassInfo : NamedModel 
{ 
    public PropertyInfos _properties;  
    public PropertyInfos Properties 
    { 
     get { return _properties; } 
     set { SetProperty(ref _properties, value); } 
    } 
} 

public class PropertyInfos : List<PropertyInfo> { } 

public sealed class PropertyInfo : NamedModel 
{ 
} 

I LibraryInfo Klassen auf einer ListView für Klassen Auswahl binden möchten.

<ListView SelectedItem="{Binding SelectedClass}" ItemsSource="{Binding LibraryInfo.Classes}"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <CheckBox /> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
      <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" /> 
     </GridView> 
    </ListView.View> 
</ListView> 

Und basierend auf ClassInfo Auswahl I Objekte Auswahl Eigenschaften der ausgewählten Klasse auf einem anderen ListView zeigen wollen.

<ListView ItemsSource="{Binding SelectedClass.Properties}"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <CheckBox /> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
      <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" /> 
     </GridView> 
    </ListView.View>   
</ListView> 

Das Problem ist, dass, wie kann ich (CheckBox IsChecked) Gegenstände, weil mein ursprüngliches Modell enthält keine solche Eigenschaft wie IsActive geprüft Spur UI verwandter Bereich von meinem Modell entkoppelt zu halten.

Ich suche eine elegante und einfache Lösung für dieses Problem.

+0

Wie Sie sagen, das ist eine Modellklasse. Um die Änderungen der Benutzeroberfläche zu verfolgen, benötigen Sie eine ViewModel-Klasse. Anstatt Ihr Modell direkt zu binden, wickeln Sie es mit einem Ansichtsmodell ein und binden Sie es an diese Klasse. –

+0

@ qqww2, ich weiß, dass es in ViewModel eingewickelt werden sollte, aber auf diese Weise werden ViewModel ziemlich komplex. Ich suche stattdessen eine einfache Lösung. Können Sie bitte die Richtung mit dem Code spezifisch angeben. –

Antwort

1

Verwenden Sie Mischverhalten.

Verwenden Sie einen Collection in Ihrem ViewModel für ausgewählte Elemente.

Schreiben Sie eine ICommand namens UpdateSelectedItemsCommand und übergeben Sie 1/0 Parameter zum Hinzufügen/Löschen von Elementen.

 <CheckBox ...> 
      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="Checked"> 
        <i:InvokeCommandAction Command="{Binding UpdateSelectedItemsCommand}" 
                  CommandParameter="1"/> 
       </i:EventTrigger> 
       <i:EventTrigger EventName="Unchecked"> 
        <i:InvokeCommandAction Command="{Binding UpdateSelectedItemsCommand}" 
                  CommandParameter="0"/> 
       </i:EventTrigger> 
      </i:Interaction.Triggers> 
     </CheckBox>