我有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
上的属性。 不同之处在于我在这里使用转换器,并尝试绑定到列(而不是网格)上的属性。但是,即使我从上面的样式中删除转换器,也没有绑定发生。
答案 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.Source
和x:Reference
中所提到的那样,通过列名也可能会有效,具体取决于结构。如果您可以将带引用的零件移动到被引用元素的资源中,您通常可以摆脱周期性依赖性错误。您只需要在需要该部分的地方使用StaticResource
扩展名,而不是太方便。