2016-04-04 3 views
1

У меня есть довольно сложный объект модель, имеющая вложенные объекты пользовательских коллекций/модель, как показано ниже:WPF ListView с помощью пользовательского множественного CheckBox внутри

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 
{ 
} 

Я хочу, чтобы связать LibraryInfo классов на одном ListView для выбора классов.

<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> 

И на основе ClassInfo выбора Я хочу, чтобы показать свойства выбранного класса на другой ListView для выбора свойств.

<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> 

Проблема заключается в том, что, как я могу отслеживать проверил (CheckBox IsChecked) предметы, потому что моя оригинальная модель не содержит каких-либо такое свойство, как IsActive, чтобы сохранить поле, связанные с UI отделено от моей модели.

Я ищу элегантное и простое решение этой проблемы.

+0

Как вы говорите, это класс модели. Чтобы отслеживать изменения пользовательского интерфейса, вам нужен класс ViewModel. Вместо того, чтобы напрямую привязывать вашу модель, оберните ее моделью и привяжите к этому классу. –

+0

@ qqww2, я знаю, что это должно быть завернуто в ViewModel, но таким образом ViewModel становится более сложным. Вместо этого я ищу простое решение. Не могли бы вы дать направление, используя код. –

ответ

1

Использование Blend поведения.

Используйте Collection в своем ViewModel для выбранных товаров.

Напишите ICommand под номером UpdateSelectedItemsCommand и передайте параметры 1/0 для добавления/удаления элементов.

 <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> 
Смежные вопросы