使用DataTemplate中应用的样式绑定到DataGridTemplateColumn?

时间:2012-05-01 18:56:06

标签: wpf xaml data-binding styles datatemplate

我有ComboBox组成DataTemplate,我无法将其IsEnabled属性绑定到模板IsReadOnly上的DataGridTemplateColumn属性。

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

  在'object'''ContentPresenter'上找不到

'IsReadOnly'属性

ComboBox样式:

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

我认为问题在于我如何指定用于识别RelativeSource的{​​{1}}。我试过了:

  • DataGridColumn

  • RelativeSource={RelativeSource TemplatedParent}

  • RelativeSource AncestorType={x:Type DataGridColumn}

我已尝试将其他setter添加到此样式,并且它们确实生效,因此我知道样式并且RelativeSource AncestorType={x:Type DataGridTemplateColumn}正在应用于控件。

P.S。

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

2 个答案:

答案 0 :(得分: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>

DataGrid Cell.ReadOnly应该从其DataGrid Column.IsReadOnly中获取值。

答案 1 :(得分:1)

将列创建为资源可能会有效,这样您就可以使用StaticResource来定位它。 e.g。

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

正如评论Binding.Sourcex:Reference中所提到的那样,通过列名也可能会有效,具体取决于结构。如果您可以将带引用的零件移动到被引用元素的资源中,您通常可以摆脱周期性依赖性错误。您只需要在需要该部分的地方使用StaticResource扩展名,而不是太方便。