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.
- 1. WPF: sola lettura dire TextBox e binding
- 2. Come rendere WPF DataGridCell ReadOnly?
- 3. Elementi di sola lettura Esegui elementi in un RichTextBox WPF?
- 4. Un CheckBox di sola lettura in C# WPF
- 5. sola lettura vs auto (sola lettura) Proprietà
- 6. Modello intero in sola lettura
- 7. Associazione dinamica nel modello DataGridCell WPF
- 8. Come estrarre DataGridCell dalla classe DataGridCellinfo in WPF
- 9. Perché utilizzare in sola lettura in C#
- 10. Crea una sola tabella in mysql di sola lettura
- 11. "Sola lettura" Proprietà Accessor in C#
- 12. Come fare DropDownList sola lettura in C#
- 13. sola lettura proprietà in C# 6.0
- 14. Specificando sola lettura sessione in ASP.NET MVC
- 15. Leggere l'elemento HttpRuntime.Cache in sola lettura
- 16. diritti di accesso in sola lettura CouchDB
- 17. CodeMirror: righe particolari in sola lettura
- 18. Accesso in sola lettura del repository Subversion
- 19. Disabilita/sola lettura tag in html
- 20. Proprietà di sola lettura in Objective-C?
- 21. proprietà di sola lettura in PHP?
- 22. NHibernate Linq in modalità di sola lettura
- 23. Scrittura in una sessione di sola lettura in MVC 3+
- 24. sola lettura attribuiscono alternare
- 25. Hibernate sola lettura Transaction
- 26. Selezionare DataGridCell da DataGrid
- 27. VB.net proprietà automatica - sola lettura?
- 28. Apri file di sola lettura
- 29. Modifica file in modalità di sola lettura in Python
- 30. Come rendere QCheckBox in sola lettura, ma non in grigio
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