2013-07-04 6 views
5

Так, например, у меня есть некоторые приложения MVVM WPF с простой моделью:Почему я не могу использовать DynamicResource с DataGridColumn.CellStyle

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

и простой модели представления, что создает 3 строки:

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

И у меня есть DataGrid с определенными вручную столбцами, и для каждого столбца я устанавливаю CellStyle. Оба стиля определены в блоке Window.Resources. Но для первого столбца, я использую StaticResource и второго DynamicResource

Посмотреть 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> 

Так проблема: во втором столбце, ресурс не будет применен к колонка.

see second column

+0

Это похоже на ожидаемое поведение для меня? Можете ли вы пояснить, что вы чувствуете, проблема? – MoonKnight

+0

Проблема в том, что 'CellStyle' является' DependencyProperty', но когда я пытаюсь использовать привязку в нем, он не работает. Очевидно, что они сделали это «DependencyProperty» по какой-то причине. – Envilogger

+2

Что произойдет, если вы переместите стиль BaseCellClass в свои ресурсы приложения (или другое место, загруженное до инициализации 'Window')? –

ответ

1

Вы можете создать ресурсы для свойств в вашем DataGridCellStyle, а затем ссылаться на них как DynamicResource в Style определения:

Основываясь на вашем примере это будет выглядеть так:

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

Ресурсы, конечно, будут располагаться в отдельных файлах ресурсов.

+0

Спасибо. Твоя душа действует отлично. Но в вопросе я забыл сказать, что мне нужен способ вывода стилей, как в этом вопросе: http: // stackoverflow.com/questions/9490264/dynamicresource-for-style-basedon – Envilogger

+0

В любом случае я помету ваш ответ как правильно и опубликую свое собственное решение, где я использую небольшое обслуживание для этого – Envilogger

0

Я нашел решение с использованием небольшого обслуживания. В нескольких словах я пишу в XAML этот код:

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

Здесь, как вы можете видеть, я использую вложенное свойство ColumnTag для идентификации столбцов. И я создаю элемент управления сервисом, который определяет стили для столбцов и устанавливает целевой набор данных как TargetGrid Если вы хотите увидеть весь код, вот ссылка на решение на google drive