更新页面(数据源)时无法重置WPF CheckBox IsChecked

时间:2010-02-26 06:48:32

标签: wpf

我对复选框有疑问。 首先, 我有一个usercontrol,它有一个这样的列表框,这个用户控件将被2按钮切换,然后数据源被更改,然后显示的官员状态将被更改:

当我勾选复选框时,人员[0] .IsOnDuty将更改为true。 问题是: 当我单击另一个按钮并切换到另一个数据源时,仍会选中此复选框,但此数据源的Officers [0] .IsOnDuty为false。

如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

列表框项的数据上下文是您的人员集合的项目,而不是集合本身。并且使用单向绑定是不正确的,因为数据源(人员)将不会更新。因此,将DataTemplate更改为:

<CheckBox IsChecked="{Binding Path=IsOnDuty, Mode=TwoWay}" />

答案 1 :(得分:0)

*这是列表框xaml:

<ListBox ItemsSource="{Binding OfficersCollection}">
<ListBox.ItemTemplate>             
<DataTemplate>                                           
<CheckBox IsChecked="{Binding Path=Officers[0].IsOnDuty, Mode=OneWay}" />

              *

答案 2 :(得分:0)

您的方法的问题是,一旦您更改ItemsSource(通过切换到下一页),您的chekcbox仍然绑定到第一个集合的项目。我认为这是因为您明确使用索引器来绑定Path=Officers[0].IsOnDuty

您的样本列表框xaml确实没有意义。 ItemsSoruce是一个OfficerCollection,你的ItemTemplate也绑定到一个官员集合。根据您要完成的任务,您应该执行以下操作之一:

如果您只对副驾驶感兴趣(如您的示例所示),请将DependencyProperty FirstOfficer(或INotifyPropertyChanged)属性添加到您的集合并绑定到它:IsChecked="{Binding Path=Officers.FirstOfficer, Mode=OneWay}"

如果您对所有官员感兴趣并想要所有官员的复选框,您应该为Officer类型创建一个DataTemplate并将其用作ItemTemplate。

一般情况下,如果你坚持使用MVVM并且非常接近View所需的ViewModel对象,那么你可以避免很多麻烦,这样你就可以用最简单的方式将View绑定到ViewModel。可以将ViewModel视为您要构建的视图,但没有可视化表示。