ListView 中的 UWP 绑定复选框

UWP Binding Checkboxes in ListView

所以我试图设计一个列表视图,其中每个项目都有一个复选框,该复选框绑定到 MVVM Light 中的 bool 属性。我有一切绑定和正常工作,但现在我想添加一个 "Select All" 和 "Select None" 按钮。

列表视图

<ListView SelectionMode="None" ItemsSource="{x:Bind ViewModel.Campuses, Mode=OneWay}">
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="data:Campus">
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
                <CheckBox IsChecked="{x:Bind selected, Mode=TwoWay}" Content="{x:Bind Name}" x:Name="checkBox"/>
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

代码

private ObservableCollection<Campus> _campuses { get; set; }
public ObservableCollection<Campus> Campuses
{
    get
    {
        return _campuses;
    }
    set
    {
        _campuses = value;
        RaisePropertyChanged("Campuses");
    }
}

所以绑定工作正常,您自己选中该框会更改保存在对象中的值。但是,当我尝试以编程方式更改这些内容时,UI 不会更新,只会更新后面的代码。

我想怎么做

public void SelectAll()
{
    foreach (var item in Campuses)
    {
        item.selected = true;
    }
    RaisePropertyChanged("Campuses");
}

当前有效

public void SelectNone()
{
    List<Campus> old = Campuses.ToList<Campus>();

    foreach (var item in old)
    {
        item.selected = false;
    }
    Campuses = new ObservableCollection<Campus>(old);
}

有没有办法更改 ObservableCollection 中的所有值并在 ListView 中更新对象中的值,而不必完全重新分配我也绑定的 ObservableCollection

非常感谢!

您需要注意 DataBinding 仅在每个绑定元素都实现了 INotifyPropertyChanged 接口时才有效。

意思是,如果您将复选框绑定到 Campus class 的 Selected 属性,您还需要添加 INotifyPropertyChanged Campus class 本身。

当您随后更改 Selected 属性 的值时,它会自动在 UI 中反映此更改。

解决方案代码 我在校园里添加了以下内容class来解决问题:

private bool _selected = false;

public bool selected
{
    get
    {
        return _selected;
    }
    set
    {
        _selected = value;
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs("selected"));
        }

    }
}

public event PropertyChangedEventHandler PropertyChanged;