2010-06-01 11 views
11

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

+0

l'IsReadOnly è un risultato booleano per verificare che la cella sia readOnly o Not, ecco perché è una proprietà readonly :) – VoodooChild

+0

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

+1

@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

risposta

7

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.

0

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

7

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

+0

+1 per la sola soluzione WPF :) –

2

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

Questo non funziona per le singole celle, solo per colonne intere. .. – Sven

+0

@Sven Funziona per me ... – MgSam

+1

Non funziona per le singole celle. –