WPF Datagrid con alcune righe di sola lettura



Answers

Ho trovato un paio di semplici soluzioni a questo problema. Il migliore a mio avviso è stato l'hooking dell'evento BeginningEdit di DataGrid. Questo è simile a quello che ha fatto Nigel Spencer nel suo post, ma non è necessario sostituirlo con DataGrid. Questa soluzione è ottima poiché non consente all'utente di modificare alcuna cella in quella riga, ma consente loro di selezionare la riga .

Nel codice dietro:

private void MyList_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
{
  if (((MyCustomObject)e.Row.Item).IsReadOnly)  //IsReadOnly is a property set in the MyCustomObject which is bound to each row
  {
    e.Cancel = true;
  }
}

In XAML:

<DataGrid ItemsSource="{Binding MyObservableCollection}"
          BeginningEdit="MyList_BeginningEdit">
  <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding Name}"
                        Header="Name"/>
    <DataGridTextColumn Binding="{Binding Age}"
                        Header="Age"/>
  </DataGrid.Columns>
</DataGrid>

Soluzione diversa ... Ciò non consente all'utente di selezionare la riga, ma non richiede codice aggiuntivo nel codice sottostante.

<DataGrid ItemsSource="{Binding MyObservableCollection}">
  <DataGrid.Resources>
    <Style TargetType="{x:Type DataGridRow}">
      <Style.Triggers>
        <DataTrigger Binding="{Binding IsReadOnly}"
                     Value="True" >
        <Setter Property="IsEnabled"
                Value="False" />   <!-- You can also set "IsHitTestVisble" = False -->
        </DataTrigger>

      </Style.Triggers>
    </Style>
  </DataGrid.Resources>

  <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding Name}"
                        Header="Name"/>
    <DataGridTextColumn Binding="{Binding Age}"
                        Header="Age"/>
  </DataGrid.Columns>
</DataGrid>
Question

Ho la necessità di mostrare alcune delle mie righe Datagrid WPF come di sola lettura o meno a seconda di una proprietà sul mio modello associato.

Come si può fare?




Links