Ich habe eine Situation, die readonly zu WPF DataGrid Zelle bedingt machen muss. In DataGridCell befindet sich die IsReadOnly-Eigenschaft. Aber leider ist diese Eigenschaft nur gelesen! Gibt es einen Weg, es zu tun?
ant.Bedingt nur Lesezugriff auf WPF DataGridCell
Antwort
Sie können das Ereignis DataGrid.BeginningEdit verwenden, um bedingt zu prüfen, ob die Zelle bearbeitbar ist, und dann die Eigenschaft Cancel für die Ereignisargumente festlegen, wenn nicht.
Sie können auch die TemplateSelector-Eigenschaft verwenden, um zwei verschiedene DataTemplates (einen schreibbaren und einen schreibgeschützten) basierend auf Ihrer Logik festzulegen? Erstellen Sie einfach eine Klasse, die von DataTemplateSelector erbt und überschreiben Sie die SelectTemplate() -Methode (hier haben Sie Zugriff auf den Datenkontext).
Die ähnliche Lösung wie oben Goblin, aber mit etwas Code-Beispiele:
Die Idee ist, dynamisch die CellEditingTemplate
zwischen zwei Vorlagen zu schalten, ist eine das gleiche wie das eine in der CellTemplate
, das andere für die Bearbeitung ist, . Dadurch verhält sich der Bearbeitungsmodus genau wie die nicht bearbeitbare Zelle, obwohl er sich im Bearbeitungsmodus befindet.
Hier finden Sie einige Beispiel-Code, dies zu tun, beachten Sie, dass dieser Ansatz erfordert DataGridTemplateColumn
:
Zunächst definieren zwei Vorlagen für schreibgeschützte und Bearbeiten von Zellen:
<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>
Dann eine Datenvorlage definieren mit zusätzlichen ContentPresenter
Schicht und Trigger
verwenden, um die ContentTemplate
der ContentPresenter
zu wechseln, so dass die oben genannten zwei Vorlagen dynamisch durch die IsEditable
Bindung:
<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 für die WPF-Lösung :) –
Eine weitere sehr einfache Lösung für dieses Problem ist es, eine Art des 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>
Dieser Stil zu verwenden, geht davon aus, dass es eine IsEnabled Eigenschaft im Ansichtsmodell ist.
Dadurch wird die Zelle nicht nur gelesen, sondern deaktiviert. Es ist fast dasselbe, außer dass es nicht ausgewählt werden kann. Diese Lösung ist möglicherweise nicht in allen Fällen anwendbar.
- 1. Wrap Text in DataGridCell WPF
- 2. Wie mache ich WPF DataGridCell ReadOnly?
- 3. Dynamische Bindung in WPF DataGridCell Vorlage
- 4. wpf datagridcell gehe in editmodus wenn fokussiert
- 5. Binding Datagridcell ToolTip-Eigenschaft auf den Wert der Datagridcell
- 6. DataGridCell BorderBrush funktioniert nicht
- 7. MahApps Datagridcell Stil
- 8. Wie formatiere ich einen WPF TextBlock bedingt?
- 9. JMX Passwort Lesezugriff Ausgabe
- 10. Git/Gitosis - Repository Lesezugriff verweigert
- 11. WPF FlowDocument Drucken nur auf kleinen Bereich
- 12. iPhone/iPad itunes Bibliothek Lesezugriff?
- 13. HTTP-Header bedingt bedingt auf Servlet-Antwort setzen müssen
- 14. C: Wie bestimmte Codeteile bedingt auf Compiler-Typ bedingt kompilieren?
- 15. WPF DataGrid Trigger auf Zellinhalt
- 16. WPF DataGrid MouseOver auf DataGridRow
- 17. bedingt basierend auf der Zeit
- 18. Bedingt kompilieren basierend auf endianess
- 19. WPF Validierung auf Textfeld nur auf Buttonclick nicht auf Windowload
- 20. SQL Server: Gewähren Sie allen Benutzern Lesezugriff auf eine Datenbank
- 21. DataGridCell für SelectedItem im Fokus, wenn DataGrid den Tastaturfokus empfängt
- 22. Django Migration RunSQL bedingt auf Datenbanktyp
- 23. Kann Lesezugriff gewährt werden Webkonsole 7?
- 24. Wie Laden @ Font-Faces bedingt auf Klassenpräsenz?
- 25. Datenbankregel zum Auflisten von Kindern mit Lesezugriff
- 26. C# parallel Lesezugriff ohne zur Liste Kopieren
- 27. MVC6: Wie Skripte nur für IE bedingt laden?
- 28. WPF-Fenster ziehen nur vertikal
- 29. anzeigen Formularfelder bedingt basierend auf Benutzereingaben
- 30. Führt eine flüchtige Nur-Wert-Anweisung einen Lesezugriff in C aus?
Das IsReadOnly ist ein boolesches Ergebnis, um zu überprüfen, ob die Zelle readOnly oder Not ist, deshalb ist es eine readonly Eigenschaft :) – VoodooChild
IsReadOnly Eigenschaft ist lesen/schreiben auf DataGrid welches das Wurzelelement von Datagrid ist. IsReadOnly-Eigenschaft ist nicht in Unterelementen von DataGrid wie DataGridCell einstellbar, da es nicht sinnvoll ist, DataGridCell.IsReadOnly auf true festzulegen, wenn DataGrid.IsReadyOnly false ist – VoodooChild
@VoodooChild Der Hauptgrund, warum Sie IsReadOnly nicht auf einer DataGridCell festlegen können weil sie vergänglich sind. Sie werden bei Bedarf erstellt und verworfen, da das DataGrid nicht alle seine Zeilen und Zellen zu einem beliebigen Zeitpunkt im Speicher enthält. Sie können diese Eigenschaft also auch dann nicht festlegen, wenn sie beschreibbar ist. – Josh