1

我有一个包含两列的列表视图,一列包含一个文本框,另一列包含一个复选框。这些绑定到自定义对象的 ObservableCollection,其中包含文本框的字符串和复选框的布尔值。

一切都运行良好,直到我尝试让复选框的检查事件突出显示它是列表视图中的行,如本文中所示。

我的问题是复选框不再绑定到 ObservableCollection。文本框绑定没问题,但是将 checkbox 声明更改为:

<CheckBox IsChecked="{Binding RestrictedEdit}"/>

对此:

<CheckBox IsChecked="{Binding RestrictedEdit, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}}"/>

停止复选框绑定,并且列表视图显示为所有未选中的复选框,无论布尔值的状态如何。我究竟做错了什么?

4

2 回答 2

2

您正在尝试绑定到没有的RestrictedEdit属性ListViewItem。这个属性是在视图模型中声明的,它存储在 中DataContext,所以这应该可以工作:

<CheckBox IsChecked="{Binding DataContext.RestrictedEdit,
                              RelativeSource={RelativeSource FindAncestor,
                                              AncestorType={x:Type ListViewItem}}}"/>

但是,我看不出有任何理由使用此代码而不是 simple IsChecked="{Binding RestrictedEdit}"CheckBox继承DataContextListViewItem,因此没有理由使用相对源。

于 2012-06-29T10:54:47.277 回答
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}"
于 2012-06-29T11:06:00.033 回答