在DataTemplate中应用样式绑定到DataGridTemplateColumn,是否可行?

3
我有一个ComboBox,它包含一个DataTemplate,我想将其IsEnabled属性绑定到模板DataGridTemplateColumn上的IsReadOnly属性,但遇到了问题。
在VS输出窗口中,我收到以下错误信息:

'IsReadOnly'属性在'object''ContentPresenter'上未找到

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

我认为问题出在如何指定DataGridColumnRelativeSource上。我尝试过以下方式:
  • RelativeSource={RelativeSource TemplatedParent}

  • RelativeSource AncestorType={x:Type DataGridColumn}

  • RelativeSource AncestorType={x:Type DataGridTemplateColumn}

我已经尝试添加其他设置项到这个样式中,它们确实生效,所以我知道样式和DataTemplate已经被应用到控件上。 P.S. 我曾使用同样的技术将DataTemplate中的另一个ComboBox绑定到父级DataGrid的模板列属性。不同之处在于,这里我使用了转换器,并尝试将其绑定到列的属性(而不是网格)。但是,即使我从上面的样式中删除转换器,也没有进行任何绑定。

1
无法像那样绑定到列,因为它们不是逻辑或可视树中的对象,它们只是数据,因此RelativeSource将失败。您应该调试绑定,肯定会得到绑定错误。 - H.B.
@H.B. 这是一篇非常棒的文章,谢谢你提供这个信息!我输出窗口中发现的绑定错误与问题中相同...如果你知道解决方法或其他实现目标的方法,请发布一个答案,我很乐意接受。 - Rob
1
这是你使用 TemplatedParent 时遇到的错误,对于绑定到列,你应该会得到有关找不到源的信息。无论如何,通常你只能使用 Binding.Sourcex:Reference 结合来绑定 DG 列,可能会出现循环依赖的复杂情况。 - H.B.
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中获取值。


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扩展,这并不是非常方便。

+1 对于这个信息丰富的答案。很抱歉我没有按照评论中所述接受,但Stipo提供了一个简洁有效的答案,而这种方法需要重新构建我的XAML。将来可能会使用这个 :) - Rob
@robjb:我必须说,这是一个非常有趣的想法,值得接受。 - H.B.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接