3

我有一个ComboBox组成 a 的 a DataTemplate,我无法将其IsEnabled属性绑定到IsReadOnlytemplated 上的属性DataGridTemplateColumn

我在 VS 输出窗口中收到以下错误:

在“对象”“ContentPresenter”上找不到“IsReadOnly”属性

组合框样式:

<Style TargetType="{x:Type ComboBox}" x:Key="ProficiencyColumnComboBoxStyle">
    <Setter Property="IsEnabled" 
        Value="{Binding RelativeSource={RelativeSource Mode=TemplatedParent},
        Path=IsReadOnly, Converter={StaticResource BooleanOppositeConverter}}" />
</Style>

我认为问题在于我如何指定RelativeSource要识别我的DataGridColumn. 我试过了:

  • RelativeSource={RelativeSource TemplatedParent}

  • RelativeSource AncestorType={x:Type DataGridColumn}

  • RelativeSource AncestorType={x:Type DataGridTemplateColumn}

我尝试将其他设置器添加到此样式中,并且它们确实生效,因此我知道样式并DataTemplate正在应用于控件。

附言

我已经使用相同的技术将 a 中的另一个绑定ComboBox到其模板列DataTemplate的父级上的属性。不同之处在于,我在这里使用了转换器,并尝试绑定到列(而不是网格)上的属性。但是,即使我从上述样式中删除了转换器,也不会发生绑定。DataGrid

4

2 回答 2

3

试试这个:

<Style TargetType="{x:Type ComboBox}" x:Key="ProficiencyColumnComboBoxStyle">
    <Setter Property="IsEnabled" 
            Value="{Binding IsReadOnly, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridCell}}, Converter={StaticResource BooleanOppositeConverter}}"/>
</Style>

DataGridCell.IsReadOnly 应该从其 DataGridColumn.IsReadOnly 中获取值。

于 2012-05-01T19:51:53.160 回答
1

将列创建为资源可能会奏效,这样您就可以使用StaticResource它来定位它。例如

<DataGrid.Resources>
    <DataGridTemplateColumn x:Key="Column" .../>
</DataGrid.Resources>
<DataGrid.Columns>
    <StaticResource ResourceKey="Column"/>
</DataGrid.Columns>
{Binding IsReadOnly, Source={StaticResource Column}}

正如评论中提到的Binding.Sourcex:Reference通过列的名称也可能会起作用,具体取决于结构。如果您可以将带有引用的部分移动到被引用元素的资源中,您通常可以摆脱循环依赖错误。您只需要在需要StaticResource该部分的地方使用扩展程序,并不太方便。

于 2012-05-01T19:16:38.420 回答