DataGridColumn Readonly 通过转换器

DataGridColumn Readonly via converter

我有一个包含三列的数据网格。

如果第一列的值不为空,我希望第二列只读

我尝试使用转换器,但出现问题。 任何想法为什么?

<UserControl.Resources
    <Converters:StringToBoolConverter x:Key="stringToBoolConverter"/>
</UserControl.Resources>

   .......................................

<DataGrid Grid.Column="2" Grid.RowSpan="2" HorizontalAlignment="Stretch" Name="_edgFAI" AddCommandVisibility="Visible" InternalCommandsHandling="False" DeleteCommandVisibility="Visible" SaveCommandVisibility="Visible">
    <DataGrid.Columns>
         <DataGridTextColumn Header="IdenFAI" Tag="ID_FAI" Width="Auto" IsReadOnly="True"/>
         <DataGridTextColumn Header="Description" Tag="DS_FAI" Width="Auto" IsReadOnly="{Binding Path=ID_FAI, Converter={StaticResource stringToBoolConverter}}" />
         <DataGridTextColumn Header="DocumentState" Tag="FAI_STATE" Width="SizeToHeader" IsReadOnly="True"/>
    </DataGrid.Columns>
</DataGrid>

如果您查看输出日志,您很可能会注意到此错误:

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element.

列定义不在可视化树中,因此 IsReadOnly 属性 不绑定到任何数据上下文相关项。有关更深入的解释,请参阅此 similar question.

的答案

您可以使用该解决方案,但也可以只设置编辑元素的样式:

<DataGridTextColumn Header="Description" Binding="{Binding Name}">
    <DataGridTextColumn.EditingElementStyle>
        <Style TargetType="TextBox">
            <Setter Property="IsReadOnly" 
                    Value="{Binding Path=ID_FAI, Converter={StaticResource stringToBoolConverter}}" />
        </Style>
    </DataGridTextColumn.EditingElementStyle>
</DataGridTextColumn>

或者使用模板列并定义您自己的编辑模板(无论如何都会类似)。