2013-07-04 9 views
5

Così, per esempio ho un po 'di applicazione WPF MVVM con semplice modello:Perché non posso usare DynamicResource con DataGridColumn.CellStyle

public class MyObject 
{ 
    public string F1 { get; set; } 
    public string F2 { get; set; } 
} 

e semplice modello di vista che crea 3 file:

public class MyViewModel 
{ 
    public ObservableCollection<MyObject> Objects { get; set; } 

    public MyViewModel() 
    { 
     Objects = new ObservableCollection<MyObject> 
      { 
       new MyObject{F1 = "V1",F2 = "B1"}, 
       new MyObject{F1 = "V2",F2 = "B2"}, 
       new MyObject{F1 = "V3",F2 = "V3"} 
      }; 
    } 
} 

E in vista ho un DataGrid con colonne definite manualmente e per ogni colonna ho impostato CellStyle. Entrambi gli stili sono definiti nel blocco Window.Resources. Ma per prima colonna, io uso StaticResource e per la seconda DynamicResource

visualizzazione XAML:

<Window x:Class="WpfApplication12.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525" x:Name="WholeWindow"> 
<Window.Resources> 
    <Style x:Key="BaseCellClass" TargetType="DataGridCell"> 
     <Setter Property="Foreground" Value="Blue" /> 
    </Style> 
</Window.Resources> 
<Grid> 
    <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding ElementName=WholeWindow, Path=ViewModel.Objects}"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding F1}" Header="F1" CellStyle="{StaticResource BaseCellClass}" /> 
      <DataGridTextColumn Binding="{Binding F2}" Header="F2" CellStyle="{DynamicResource BaseCellClass}" /> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 

Quindi il problema è: nella seconda colonna, la risorsa non ottiene applicato al colonna.

see second column

+0

Questo mi sembra il comportamento previsto? Puoi chiarire qual è il problema? – MoonKnight

+0

Il problema è che 'CellStyle' è una' DependencyProperty', ma quando provo a usare l'associazione in esso, non funziona. Chiaramente hanno reso 'DependencyProperty' per un motivo. – Envilogger

+2

Cosa succede se si sposta lo stile BaseCellClass sulle risorse dell'applicazione (o su un'altra posizione caricata prima dell'inizializzazione di 'Window')? –

risposta

1

È possibile creare le risorse per le proprietà nella tua DataGridCellStyle e poi farvi riferimento come DynamicResource nella definizione Style:

Sulla base della vostra esempio sarebbe simile a questa:

<Window.Resources> 
    <SolidColorBrush x:Key="ForegroundBrush" Color="Blue"/> 

    <Style x:Key="BaseCellClass" TargetType="DataGridCell"> 
     <Setter Property="Foreground" Value="{DynamicResource ForegroundBrush}" /> 
    </Style> 
</Window.Resources> 
<Grid> 
    <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding ElementName=WholeWindow, Path=ViewModel.Objects}"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding F1}" Header="F1" CellStyle="{StaticResource BaseCellClass}" /> 
      <DataGridTextColumn Binding="{Binding F2}" Header="F2" CellStyle="{StaticResource BaseCellClass}" /> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 

Le risorse saranno ovviamente posizionate in file di risorse separati.

+0

Grazie. La tua anima funziona bene. Ma nella domanda ho dimenticato di dire che ho bisogno di un modo per derivare stili come in questa domanda: http: // StackOverflow.it/questions/9490264/dynamicresource-per-style-basedon – Envilogger

+0

In ogni caso segnerò la tua risposta come corretta e pubblicherò la mia soluzione dove uso un piccolo servizio per quello – Envilogger

0

Ho trovato la soluzione con l'utilizzo di un piccolo servizio. In poche parole che scrivo in XAML questo codice:

<wpfApplication12:DataGridColumnDynamicStyleService TargetGrid="{Binding ElementName=Grid}"> 
     <wpfApplication12:DataGridColumnDynamicStyleService.ColumnStyles> 
      <wpfApplication12:DataGridColumnStyleBinding ColumnTag="C1" DynamicStyle="{DynamicResource BaseCellClass}" /> 
     </wpfApplication12:DataGridColumnDynamicStyleService.ColumnStyles> 
    </wpfApplication12:DataGridColumnDynamicStyleService> 
    <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding ElementName=WholeWindow, Path=ViewModel.Objects}" x:Name="Grid"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding F1}" Header="F1" wpfApplication12:DataGridColumnDynamicStyle.ColumnTag="C1" /> 
      <DataGridTextColumn Binding="{Binding F2}" Header="F2" wpfApplication12:DataGridColumnDynamicStyle.ColumnTag="C2" /> 
     </DataGrid.Columns> 
    </DataGrid> 

Qui, come si può vedere, io uso attaccato proprietà ColumnTag per identificare le colonne. E creo un controllo di servizio che definisce gli stili per le colonne e imposta il datagrid di destinazione come TargetGrid Se vuoi vedere tutto il codice, ecco il link alla soluzione su google drive