2010-06-01 3 views
11

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

+0

Das IsReadOnly ist ein boolesches Ergebnis, um zu überprüfen, ob die Zelle readOnly oder Not ist, deshalb ist es eine readonly Eigenschaft :) – VoodooChild

+0

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

+1

@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

Antwort

7

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.

0

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).

7

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:

geschaltet werden können
<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

+0

+1 für die WPF-Lösung :) –

2

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

Dies funktioniert nicht für einzelne Zellen - nur für ganze Spalten. .. – Sven

+0

@Sven Es funktioniert für mich ... – MgSam

+1

Nicht für einzelne Zellen arbeiten. –

Verwandte Themen