我对复选框有疑问。 首先, 我有一个usercontrol,它有一个这样的列表框,这个用户控件将被2按钮切换,然后数据源被更改,然后显示的官员状态将被更改:
当我勾选复选框时,人员[0] .IsOnDuty将更改为true。 问题是: 当我单击另一个按钮并切换到另一个数据源时,仍会选中此复选框,但此数据源的Officers [0] .IsOnDuty为false。
如何解决这个问题?
答案 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视为您要构建的视图,但没有可视化表示。