我有一个listview,它的项源被数据绑定到一个自定义数据类型的可观察集合。列表中的每个对象都具有属性DisplayName(字符串)和IsChecked(bool)等。数据模板基本上是:
<CheckBox VerticalAlignment="Center"
Content="{Binding DisplayName}"
IsChecked="{Binding IsChecked}"/>
当我勾选方框时,我能够轻松确定现在已经检查过的基础项目。但是在viewmodel中,如果我想取消选中一个项目,它似乎不会以其他方式工作。
我在可观察集合的setter中实现了NotifyProperty更改,但是我是否需要为bool执行一些特殊操作?
在Viewmodel中,以下代码是我尝试取消选中已选中复选框的位置(作为运行命令后的刷新类型):
foreach (var bill in AllBills)
{
bill.IsChecked = false;
}
答案 0 :(得分:2)
我在可观察集合的setter中实现了NotifyProperty更改,但是我是否需要为bool执行一些特殊操作?
是。当您为集合属性提供新集合时,您将为该属性引发PropertyChanged
。这与在集合中的项目上更改的属性值有什么关系?什么都没有。当您在其中一个项目上设置IsChecked
时,是否有任何可以想象的方式让该代码点击集合属性的setter?不。
集合中的项目必须自己实施INotifyPropertyChanged
,IsChecked
的设置者必须在PropertyChanged
的值更改IsChecked
时提升{{1}} 。如果您为集合属性执行此操作,我希望您已经知道如何。但如果遇到任何障碍,请给我发表评论。
WPF学习曲线的一个难点部分是开发一种可靠的直观感觉,即通过秘密框架彩虹小马魔法发生的事情之间的界限,以及你必须自己做的事情。该边界线上的一个位置就是您现在站在哪里。
答案 1 :(得分:0)
如果在viewmodel中实现INotifyPropertyChanged,并在IsChecked属性中触发事件,则只需将复选框更改为:
<CheckBox VerticalAlignment="Center"
Content="{Binding DisplayName}"
IsChecked="{Binding IsChecked, Mode=TwoWay}"/>