使用MVVM构建选项列表

时间:2011-05-12 17:48:02

标签: c# wpf mvvm

我有一个ObservableCollection>我希望使用MVVM模型在WPF窗口的列表框中显示的属性。理想情况下,我希望有一个列表框,其中包含bool的复选框和字符串的标签,当用户更改复选框的值时,它将更改相应的bool。这样做的最佳方法是什么?

3 个答案:

答案 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 Descriptionbool 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)

  1. 在ViewModel中创建公共ObservableCollection属性
  2. 创建IsSelected bool属性。
  3. 从构造函数或命令填充集合。
  4. 为设置IsSelected属性的复选框创建命令。
  5. 执行Xaml绑定