Search code examples
c#wpfdatagridconvertersdatagridcolumn

DataGridColumn Readonly via converter


I have a Datagrid with three columns.

I want the second column readonly if the value of first column is not null

I tried with a converter but there's something wrong. Any ideas why?

<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>

Solution

  • If you look into output log, you'll most probably notice this error:

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

    Column definition does not reside in the visual tree, so IsReadOnly property does not bind to any data context realted item. For more in-depth explanation see the answer for this similar question.

    You can use that solution, but alternatively you can just set the style of editing element:

    <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>
    

    Or use a template column and define your own editing template (which will be similar anyway).