How to bind Itemsource of DataGridto the IsReadOnly property of the internal DataGridTextColumn?

152 Views Asked by At

I have a DataGrid (below) that takes in SimulatedItems as an ItemsSource which is from my viewmodel. The SimulatedItems is an ObservableCollection of SimulatedItem. Inside SimulatedItem there is a variable DriverID, NameID and Active. Both the DataGridTextColumns below correctly reference these variables inside for Binding but for IsReadOnly it does not work. It appears IsReadOnly is attempting to bind to my viewmodel rather than the SimulatedItems. How do I get IsReadOnly to bind to my item from ItemsSource?

<DataGrid Grid.Row="1" ItemsSource="{Binding SimulatedItems}">
  <DataGrid.Columns>
    <DataGridTextColumn
      Header="NameID"
      Binding="{Binding NameID}"
      IsReadOnly="{Binding Active}">
    </DataGridTextColumn>
    <DataGridTextColumn
      Header="DriverID"
      Binding="{Binding Path=DriverID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
      IsReadOnly="{Binding Active}">
    </DataGridTextColumn>
  </DataGrid.Columns>
</DataGrid>
1

There are 1 best solutions below

0
enesimam On

Unfortunately this will not work.

DataContexts do not work with DataGridColumns. The binding can't find the datacontext.

Read more about it here https://thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/

Solution: Use templates

<DataGrid Grid.Row="1" ItemsSource="{Binding SimulatedItems}">
     <DataGrid.Columns>
           <DataGridTemplateColumn Header="NameID" Width="200">
                 <DataGridTemplateColumn.CellTemplate>
                      <DataTemplate>
                          <TextBox Text="{Binding NameID}" IsReadOnly="{Binding  Active}" BorderThickness="0" Background="Transparent"/>
                      </DataTemplate>
                 </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn Header="DriverID" Width="200">
                  <DataGridTemplateColumn.CellTemplate>
                         <DataTemplate>
                             <TextBox Text="{Binding Path=DriverID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="{Binding Active}" BorderThickness="0" Background="Transparent"/>
                         </DataTemplate>
                  </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
     </DataGrid.Columns>
</DataGrid>