我有一个包含两列的列表视图,一列包含文本框,另一列包含复选框。这些绑定到包含文本框字符串的自定义对象的ObservableCollection和复选框的布尔值。
一直运行良好,直到我尝试复选框的检查事件突出显示它是列表视图中的行,如this article中所示。
我的问题是复选框不再绑定到ObservableCollection。文本框绑定正常,但更改了checbox声明:
<CheckBox IsChecked="{Binding RestrictedEdit}"/>
到此:
<CheckBox IsChecked="{Binding RestrictedEdit, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}}"/>
停止复选框绑定,显示列表视图,复选框全部取消选中,不选择布尔值的状态。我做错了什么?
答案 0 :(得分:2)
您正在尝试绑定RestrictedEdit
属性,而ListViewItem
没有。此属性在视图模型中声明,该模型存储在DataContext
中,因此这应该有效:
<CheckBox IsChecked="{Binding DataContext.RestrictedEdit,
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type ListViewItem}}}"/>
但是,我认为没有理由使用此代码而不是简单的IsChecked="{Binding RestrictedEdit}"
。 CheckBox
从DataContext
继承ListViewItem
,因此没有理由使用相对来源。
答案 1 :(得分:0)
让绑定原样(没有RelativeSource)并使用相似的样式或DataTemplate将自定义对象类作为TargetType,并在RestrictedEdit上设置DataTrigger。 样式的例子:
<Style x:Key="MyStyle" TargetType="MyClass">
<Setter Property="BackGround" Value="White" />
<Style.Trigger>
<DataTrigger Binding="{Binding RestrictedEdit}" Value="False">
<Setter Property="BackGround" Value="Gray" />
</DataTrigger>
</Style.Trigger>
</Style>
在您的应用程序资源中(在App.xaml中)定义此样式。 然后在列表视图中,使用:
ItemContainerStyle="{StaticResource MyStyle}"