2013-07-04 8 views
5

Tak więc, na przykład mam jakąś aplikację MVVM WPF z prostego modeluDlaczego nie mogę korzystać z DynamicResource DataGridColumn.CellStyle

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

i prostego modelu widoku, który tworzy 3 rzędy:

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"} 
      }; 
    } 
} 

A w widoku Mam DataGrid z ręcznie zdefiniowanymi kolumnami i dla każdej kolumny ustawiam CellStyle. Oba style zdefiniowane w bloku Window.Resources. Ale dla pierwszej kolumny, używam StaticResource a drugiej DynamicResource

View 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> 

Więc problem jest: w drugiej kolumnie, zasób nie stosuje się do kolumna.

see second column

+0

To wygląda jak oczekiwane zachowanie do mnie? Czy możesz wyjaśnić, na czym polega problem? – MoonKnight

+0

Problem polega na tym, że 'CellStyle' jest' DependencyProperty', ale gdy próbuję użyć wiązania, nie działa. Najwyraźniej utworzyli oni 'DependencyProperty' z jakiegoś powodu. – Envilogger

+2

Co się stanie, jeśli przeniesiesz styl BaseCellClass do zasobów aplikacji (lub innej lokalizacji, która jest ładowana przed zainicjowaniem 'okna')? –

Odpowiedz

1

Można utworzyć zasoby dla właściwości w DataGridCellStyle a następnie odwołać je jako DynamicResource w definicji Style:

Bazując na swoim przykładzie, że to wyglądać tak:

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

Zasoby będą oczywiście znajdować się w osobnych plikach zasobów.

+0

Dziękuję. Twoja dusza działa dobrze. Ale w pytaniu zapomniałem powiedzieć, że potrzebuję sposobu na wyprowadzenie stylów jak w tym pytaniu: http: // stackoverflow.com/questions/9490264/dynamicresource-for-style-basedon – Envilogger

+0

W każdym razie zaznaczę twoją odpowiedź jako właściwą i opublikuję własne rozwiązanie, w którym używam małej usługi – Envilogger

0

Znalazłem rozwiązanie przy użyciu niewielkiej usługi. W kilku słowach napisać w XAML ten kod:

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

Tutaj, jak widać, używam dołączone własności ColumnTag do identyfikacji kolumn. I tworzę kontrolkę usługi, która definiuje style kolumn i ustawia docelowy datagrid jako TargetGrid Jeśli chcesz zobaczyć cały kod, tutaj jest link do rozwiązania na google drive

Powiązane problemy