【问题标题】:Checkbox not showing as checked inside ListView复选框未在 ListView 中显示为选中状态
【发布时间】:2015-05-20 07:24:54
【问题描述】:

我在列表视图中有一个复选框。 listview 绑定到一个可观察的集合。当我使用上下文菜单尝试选择所有复选框时,它们不会显示为已选中。我做错了什么?

<ListView Grid.Row="1" Grid.Column="0" ItemsSource="{Binding AvailableModels}"
           HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
           SelectionMode="Extended">
    <ListView.ContextMenu>
        <ContextMenu>
            <MenuItem Header="Select All Models" Command="{Binding 
                      SelectAllModelsAction}" />
            <MenuItem Header="Deselect All Models" Command="{Binding 
                      DeselectAllModelsAction}" />
        </ContextMenu>
    </ListView.ContextMenu>
    <ListView.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="{Binding DataContext.IsSelected, 
                          RelativeSource={RelativeSource 
                          FindAncestor, AncestorType={x:Type 
                          ListViewItem}}}" VerticalAlignment="Center" />
                <Label Content="{Binding Name}" Margin="2,0,0,0" />
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

视图模型

public ObservableCollection<ListItems> AvailableModels
{
    get
    {
        return this.availableModels;
    }

    set
    {
        this.availableModels = value;

        this.NotifyPropertyChanged(m => m.AvailableModels);
    }
}

上下文菜单操作

private void SelectAllModels()
{
    foreach (var model in this.AvailableModels)
    {
        model.IsSelected = true;
    }

    this.NotifyPropertyChanged(m => m.AvailableModels);
}

ListItems 对象

public class ListItems
{
    public string Name
    {
        get;

        set;
    }

    public object Value
    {
        get;

        set;
    }

    public bool IsSelected
    {
        get;

        set;
    }
}

【问题讨论】:

    标签: wpf mvvm


    【解决方案1】:

    ListItems 未实现 INotifyPropertyChanged,因此更改 IsSelected 不会更新 UI。

    SelectAllModels() 中调用 NotifyPropertyChanged 是不必要的,因为集合本身没有改变。设置新集合时,AvailableModels setter 中的 NotifyProperyChanged() 调用会更新 UI。 ObservableCollection 将在集合被修改(添加/删除项目)时处理。但是,ListItems 中属性的更改不会更新 UI,除非它们在设置器中调用 NotifyPropertyChanged

    【讨论】:

    • 成功了。谢谢你的解释。它帮助我更好地理解它,希望不会再犯这个错误。
    猜你喜欢
    • 2015-11-28
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 2014-08-01
    相关资源
    最近更新 更多