我有一个ObservableCollection>我希望使用MVVM模型在WPF窗口的列表框中显示的属性。理想情况下,我希望有一个列表框,其中包含bool的复选框和字符串的标签,当用户更改复选框的值时,它将更改相应的bool。这样做的最佳方法是什么?
答案 0 :(得分:3)
尝试使用ItemsControl,不要绑定到复选框列表,定义模型:
<ItemsControl ItemsSource="{Binding YourModelList}">
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding Path=Selected}"/>
<TextBlock Text="{Binding Path=Description}" />
</StackPanel>
</ItemsPanelTemplate>
</ItemsControl>
在ViewModel中:
public ObservbleCollection<YourModel> YourModelList { get; set; }
模特:
public class YourModel
{
public bool Selected {get;set;}
public string Description {get;set;}
public int ID {get;set;}
}
根据需要实施INotifyPropertyChanged
答案 1 :(得分:2)
理想情况下,如果您想遵循MVVM方法,ObservableCollection中的每个元素都应该是ViewModel。
这些viewModel应该公开2个属性,例如string Description
和bool IsSelected
。
然后,您只需要使用样式提供ListBox,以便为每个数据绑定ViewModel显示一个复选框和文本块。
以下XAML实现了这样的Style。注意:usercontrol DataContext应该包含一个包含ObservableCollection<YourClass> Items { get; set; }
属性的ViewModel,其中YourClass公开string Description { get; set; }
和bool IsSelected { get; set; }
。你显然想要在那里投入一些INotifyPropertyChanged
魔法。
<Grid>
<Grid.Resources>
<Style x:Key="CheckBoxListStyle" TargetType="ListBox">
<Style.Resources>
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<StackPanel Orientation="Horizontal">
<CheckBox x:Name="itemChoix" Margin="5,5,0,0" IsChecked="{Binding IsSelected, Mode=TwoWay}" IsEnabled="{Binding IsEnabled, Mode=TwoWay}" />
<TextBlock Margin="5,5,0,0" Text="{Binding Description, Mode=TwoWay}" />
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Style.Resources>
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<WrapPanel Orientation="Vertical" />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
<Setter Property="BorderThickness" Value="0" />
</Style>
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="25"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Border Grid.Row="1" Style="{StaticResource BoxBorder}" Grid.Column="1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
<Grid>
<ListBox ItemsSource="{Binding Path=Items}" SelectionMode="Multiple" Style="{StaticResource CheckBoxListStyle}"/>
</Grid>
</Border>
</Grid>
答案 2 :(得分:0)