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;
所以我试图设计一个列表视图,其中每个项目都有一个复选框,该复选框绑定到 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;