Ho una situazione che deve essere eseguita in modo subordinato in sola lettura per la cella datagrid wpf. C'è una proprietà IsReadOnly in DataGridCell. Ma sfortunatamente, quella proprietà è in sola lettura! C'è modo di farlo?
ant.Effettivamente in sola lettura in WPF DataGridCell
risposta
Dovresti essere in grado di utilizzare l'evento DataGrid.BeginningEdit per verificare in modo condizionale se la cella è modificabile e quindi impostare la proprietà Cancel sugli argomenti dell'evento in caso contrario.
È inoltre possibile utilizzare la proprietà TemplateSelector per impostare due diversi DataTemplates (uno scrivibile e uno di sola lettura) in base alla logica dell'utente? Basta creare una classe che eredita da DataTemplateSelector e sovrascrivere il metodo SelectTemplate() (qui si ha accesso al datacontext).
La soluzione simile come Goblin sopra, ma con un po esempi di codici:
L'idea è quella di cambiare dinamicamente le CellEditingTemplate
tra due modelli, uno è lo stesso di quello del CellTemplate
, l'altra è per l'editing . Ciò rende la modalità di modifica esattamente uguale alla cella di non modifica anche se è in modalità di modifica.
Il seguente è alcuni esempi di codice per fare questo, si noti che questo approccio richiede DataGridTemplateColumn
:
In primo luogo, definire due modelli per le celle di sola lettura e la modifica:
<DataGrid>
<DataGrid.Resources>
<!-- the non-editing cell -->
<DataTemplate x:Key="ReadonlyCellTemplate">
<TextBlock Text="{Binding MyCellValue}" />
</DataTemplate>
<!-- the editing cell -->
<DataTemplate x:Key="EditableCellTemplate">
<TextBox Text="{Binding MyCellValue}" />
</DataTemplate>
</DataGrid.Resources>
</DataGrid>
Poi definire un modello di dati con lo strato ContentPresenter
aggiuntivo e utilizzare Trigger
per passare lo ContentTemplate
dello ContentPresenter
, in modo che i due modelli precedenti possano essere modificati dinamicamente dal binding IsEditable
:
<DataGridTemplateColumn CellTemplate="{StaticResource ReadonlyCellTemplate}">
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<!-- the additional layer of content presenter -->
<ContentPresenter x:Name="Presenter" Content="{Binding}" ContentTemplate="{StaticResource ReadonlyCellTemplate}" />
<DataTemplate.Triggers>
<!-- dynamically switch the content template by IsEditable binding -->
<DataTrigger Binding="{Binding IsEditable}" Value="True">
<Setter TargetName="Presenter" Property="ContentTemplate" Value="{StaticResource EditableCellTemplate}" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
HTH
+1 per la sola soluzione WPF :) –
Un altro molto semplice soluzione a questo problema è quello di utilizzare uno stile del DataGridCell
<DataGrid>
<DataGrid.Resources>
<Style x:Key="disabledCellStyle" TargetType="DataGridCell">
<Setter Property="IsEnabled" Value="{Binding IsEnabled}" />
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn CellStyle="{StaticResource disabledCellStyle}" />
<DataGridCheckBoxColumn CellStyle="{StaticResource disabledCellStyle}" />
<DataGridTextColumn/> /*always enabled*/
</DataGrid.Columns>
</DataGrid>
Questo stile presuppone che v'è una proprietà IsEnabled nel ViewModel.
Ciò non rende la cella di sola lettura ma disabilitata. È quasi la stessa cosa, tranne che non può essere selezionato. Questa soluzione potrebbe non essere applicabile in tutti i casi a causa di questo.
l'IsReadOnly è un risultato booleano per verificare che la cella sia readOnly o Not, ecco perché è una proprietà readonly :) – VoodooChild
La proprietà IsReadOnly è di lettura/scrittura su DataGrid che è l'elemento radice di datagrid. La proprietà IsReadOnly non è impostabile in sottoelementi di DataGrid come DataGridCell perché non ha senso impostare DataGridCell.IsReadOnly su true quando DataGrid.IsReadyOnly è false – VoodooChild
@VoodooChild Il motivo principale per cui non è possibile impostare IsReadOnly su un DataGridCell è perché sono transitori. Vengono creati e gettati via, se necessario, in quanto DataGrid non conserva tutte le sue righe e celle in memoria in qualsiasi momento. Quindi non c'è spazio nemmeno per te per impostare questa proprietà, anche se fosse scrivibile. – Josh