2014-10-08 2 views
1

Я определяющий пользовательский DataGridTextColumn со свойством добавленного «Tag» на DataGrid следующегоWPF Свойство Target для Style Trigger

<local:DataGridTextColumn Binding="{Binding Path=Company}" 
          Header="Company" 
          Tag="String" 
          IsReadOnly="True" /> 

Я определил несколько ресурсов XAML для управления визуализацией сетки, но у меня есть проблема. Я хотел бы создать пользовательский ContextMenu в DataGridColumnHeader в зависимости от значения свойства «Tag» с помощью триггеров. Тем не менее, я не могу найти способ ссылки на столбцы «Tag» значение из стиля. Я пробовал DataTriggers и обычные триггеры.

<Style TargetType="{x:Type DataGridColumnHeader}"> 
<Style.Triggers> 
     <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=local:DataGridTextColumn}, Path=Tag}" Value="String"> 
      <Setter Property="ContextMenu" Value="{StaticResource ColumnHeaderContextMenuString}" /> 
     </DataTrigger> 
     <Trigger Property="Tag" Value="Int"> 
      <Setter Property="ContextMenu" Value="{StaticResource ColumnHeaderContextMenuInt}" /> 
     </Trigger> 
     <Trigger Property="Tag" Value="DateTime"> 
      <Setter Property="ContextMenu" Value="{StaticResource ColumnHeaderContextMenuDateTime}" /> 
     </Trigger> 
    </Style.Triggers> 

ответ

0

Во-первых, вы должны получить от стилизованной DataGridColumnHeader элемента к основной колонне. Оттуда вы можете просверлить Tag. Попробуйте это:

<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Column.Tag}" 
      Value="String"> 
    <Setter Property="ContextMenu" 
      Value="{StaticResource ColumnHeaderContextMenuString}" /> 
</DataTrigger> 

Но если вы собираетесь использовать стили заголовков, то почему бы не просто стиль для каждого базового типа данных, и установите каждый столбец HeaderStyle соответственно? Вам не понадобится триггер, если каждый стиль заголовка применяется только к одному типу данных.

+0

Спасибо, Майк.Я боюсь, что это не сработало. Я пытаюсь создать универсальный стиль, который я могу применить к нескольким DataGrids без стилизации каждого из них независимо. – BigBadOwl

+0

Нечетные. Какая была ошибка привязки? Я предполагаю, что ваша сетка основана на стандартной сетке WPF, поэтому она должна иметь свойство «Column», да? –

+0

Да, он расширяет DataGrid. – BigBadOwl

0

Не применяйте решения стиля во время разработки, изменяя свойство Tag, чтобы применить стиль во время выполнения. Зачем?

Если вы можете изменить тег во время разработки, вы можете заголовок столбца придерживаться определенного стиля.

Непонятно, почему необходим способ установки стиля времени дизайна Rube Goldberg.

+0

Mine - это специальный класс DataGrid, который будет применяться ко многим DataGrids. Вышеприведенное является частью более крупного стиля, который задан в теме, примененной к приложению в целом. Я думал, что это путь XAML. У вас есть предложение, которое приведет к лучшему решению? – BigBadOwl

+0

@BigBadOwl Я понял, что нужно менять стихи в разных ситуациях. Но стили наследуются. Если страница X нуждается в стиле Y, она должна «переопределять» стили на странице (или даже уровень сетки вплоть до фактического экземпляра datagrid), и когда набор данных подбирает то, что он будет стилизовать по * страницам *. HTH – OmegaMan

0

Нет Тег Недвижимость в DataGridColumnHeader базовый тип. Использование: <Style TargetType="{x:Type local:DataGridTextColumn}"> и простые триггеры

0

Ну! Все будет хорошо в вашей работе, но есть немного концепции необходимо решить проблему:

Ключевая концепция: (Дополнительный материал для чтения) Заголовок свойство процесса двух типов «DataGridTextColumn» данных в нем, один является Тип: строка и другое - это «Тип: DataGridColumnHeader». В отличие от многих других свойств Framework, значение типа строки не будет конвертироваться в другой тип во время компиляции. Таким образом, значение параметра Header = «Компания» остается в типе данных о типе, и это означает, что значение свойства ContextMenu меньше.

Существует множество решений/способов решения этой проблемы, но я отправляю ответ, близкий к вашему подходу ....

Решение: Установить стиль, как вы делаете, но установить свойство заголовка следующим образом:

<DataGridTextColumn x:Name="CompanyColumn" Width="*" Binding="{Binding Company}"> 
    <DataGridTextColumn.Header> 
     <DataGridColumnHeader Content="Company" Tag="String"/> 
    </DataGridTextColumn.Header> 
</DataGridTextColumn> 

Для поддержки других посетителей я посылаю полный код, чтобы понять этот подход.

<Window x:Class="AnswerNo1.SolutionA" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:System="clr-namespace:System;assembly=mscorlib" 
    Title="SolutionA" Height="250" Width="400"> 
<Window.Resources> 
    <ContextMenu x:Key="ColumnHeaderContextMenuString"> 
     <MenuItem Header="_Sentence case."/> 
     <MenuItem Header="_lowercase"/> 
     <MenuItem Header="_UPPERCASE"/> 
     <MenuItem Header="_Capitalize Each Word"/> 
     <MenuItem Header="_tOGGLE cASE"/> 
    </ContextMenu> 
    <ContextMenu x:Key="ColumnHeaderContextMenuInt"> 
     <MenuItem Header="Show _SUM"/> 
     <MenuItem Header="Show _Mean"/> 
     <MenuItem Header="Show Standard Deviation"/> 
     <MenuItem Header="Subtract All Form ..."/> 
     <MenuItem Header="Toggle Sign"/> 
    </ContextMenu> 
    <ContextMenu x:Key="ColumnHeaderContextMenuDateTime"> 
     <MenuItem Header="Show Time Graph"/> 
     <MenuItem Header="Show Minimum Data"/> 
     <MenuItem Header="Show Maximum Data"/> 
     <MenuItem Header="Show Mode Day"/> 
     <MenuItem Header="Sort by day name"/> 
    </ContextMenu> 
    <Style TargetType="{x:Type DataGridColumnHeader}"> 
     <Style.Triggers> 
      <Trigger Property="Tag" Value="String"> 
       <Setter Property="ContextMenu" Value="{StaticResource ColumnHeaderContextMenuString}" /> 
      </Trigger> 
      <Trigger Property="Tag" Value="Int"> 
       <Setter Property="ContextMenu" Value="{StaticResource ColumnHeaderContextMenuInt}" /> 
      </Trigger> 
      <Trigger Property="Tag" Value="DateTime"> 
       <Setter Property="ContextMenu" Value="{StaticResource ColumnHeaderContextMenuDateTime}" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition/> 
     <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 
    <DataGrid x:Name="YourDataGrid" AutoGenerateColumns="False" Margin="3"> 
     <DataGrid.Columns> 
      <DataGridTextColumn x:Name="CompanyColumn" Width="*" Binding="{Binding Company}"> 
       <DataGridTextColumn.Header> 
        <DataGridColumnHeader Content="Company" Tag="String"/> 
       </DataGridTextColumn.Header> 
      </DataGridTextColumn> 
      <DataGridTextColumn x:Name="ReputationColumn" Width="*" Binding="{Binding Reputation}"> 
       <DataGridTextColumn.Header> 
        <DataGridColumnHeader Content="Reputation" Tag="Int"/> 
       </DataGridTextColumn.Header> 
      </DataGridTextColumn> 
      <DataGridTextColumn x:Name="SetupDateColumn" Width="*" Binding="{Binding SetupDate}"> 
       <DataGridTextColumn.Header> 
        <DataGridColumnHeader Content="Setup Date" Tag="DateTime"/> 
       </DataGridTextColumn.Header> 
      </DataGridTextColumn> 
     </DataGrid.Columns> 
    </DataGrid> 
    <Grid Grid.Row="1"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="auto"/> 
      <ColumnDefinition/> 
     </Grid.ColumnDefinitions> 
     <Label Content="Tag for 1st Column: "/> 
     <ComboBox Grid.Column="1" SelectedItem="{Binding Header.Tag, ElementName=CompanyColumn}" > 
      <System:String>String</System:String> 
      <System:String>Int</System:String> 
      <System:String>DateTime</System:String> 
     </ComboBox> 
    </Grid> 
</Grid> 

+0

Пожалуйста, публикуйте только то, что имеет отношение к вопросу, а не дополнительные материалы для чтения. –

+0

@Mohammad Спасибо за подсказку! – starchild

0

Я закончил вверх того, чтобы написать нон решение XAML для этого. Это был единственный способ получить повторно используемый DataGrid с контекстно-ориентированными контекстно-зависимыми контекстами. В других решениях все требуются сложные конфигурации при каждом добавлении сетки (плюс я не мог заставить их работать).