【问题标题】:UWP Binding Checkboxes in ListViewListView 中的 UWP 绑定复选框
【发布时间】:2018-02-19 20:01:58
【问题描述】:

所以我试图设计一个列表视图,其中每个项目都有一个复选框,该复选框绑定到 MVVM Light 中的 bool 属性。我已将所有内容绑定并正常工作,但现在我想添加一个“全选”和“全选”按钮”。

列表视图

<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 我也在绑定?

非常感谢!

【问题讨论】:

    标签: uwp windows-10 mvvm-light windows-10-universal


    【解决方案1】:

    您需要注意,DataBinding 只有在每个绑定元素都实现了INotifyPropertyChanged 接口时才能工作。

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

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

    代码解决方案 为了解决问题,我在校园类中添加了以下内容:

    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;
    

    【讨论】:

    • 非常感谢!工作完美!已将代码添加到解决方案中。
    猜你喜欢
    • 2014-08-23
    • 1970-01-01
    • 2018-10-25
    • 2019-04-13
    • 1970-01-01
    • 2018-02-06
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多