Как связать стиль со свойством любого элемента данных, который имеет элемент style? - PullRequest
2 голосов
/ 20 февраля 2012

У меня есть источник данных внутри триггера стиля, подобного следующему

<Style TargetType="DataGridCell" x:Key="ChangeAnimation" >
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=APropertyOfTheDataGridCellContext Bind DataContext}" Value="True" >
            ...
        </DataTrigger>
    </Style.Triggers>
</Style>

Я буду применять этот стиль к некоторым DataGridColumns, используя свойство CellStyle.Я хотел бы связать DataTrigger стиля со свойством datacontext ячейки, таким образом я смогу использовать этот стиль на всех необходимых столбцах вместо того, чтобы создавать новый стиль для каждого столбца.Возможно ли это?

Заранее спасибо.

РЕДАКТИРОВАТЬ: Чтобы уточнить, DataContext DataGrid является ViewModel со свойством под названием Rows, а у Rows есть свойство Cells со свойством под названиемBlink.Я хочу сослаться на свойство внутри стиля следующим образом:

<DataGrid.Resources>
<Style TargetType="DataGridCell" x:Key="ChangeAnimation" >
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=Blink}" Value="True" >
            ...
        </DataTrigger>
    </Style.Triggers>
</Style>
</DataGrid.Resources>

Это дает мне ошибку, так как DataGridResources - это тот, который содержит строки, а не ячейки.Как я могу ссылаться на DataGridCell DataContext из стиля?

1 Ответ

5 голосов
/ 20 февраля 2012

Удаление атрибута x:Key, который будет применен ко всем столбцам.

<Style TargetType="{x:Type DataGridCell}"> 
    <Style.Triggers>         
        <DataTrigger Binding="{Binding Path=DataContext.MyProperty,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGridCell}}}" Value="True" />                       
   </Style.Triggers>
</Style>

Если у вас есть 2 DataGrids, вы должны сохранить этот стиль в теге Resources DataGrid, который вы хотите изменить ...

Если RelativeSource не работает, я бы предпочел изменить шаблон столбца с помощью триггера для достижения аналогичного поведения

Запись триггера для столбца

<WpfToolkit:DataGridTemplateColumn MinWidth="50"
                                   MaxWidth="80"
                                   Header="MyHeader"
                                   IsReadOnly="True">
    <WpfToolkit:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <DataTemplate.Resources>
                <DataTemplate x:Key="normalTemplate" />
                <DataTemplate x:Key="ChangeTempalte">
                   <!-Your Controls->
                </DataTemplate>
            </DataTemplate.Resources>
            <ContentPresenter x:Name="chnagedField"
                              Content="{Binding}"
                              ContentTemplate="{StaticResource ResourceKey=normalTemplate}" />
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding Path=MyProperty}" Value="True">
                    <Setter TargetName="EditableField" Property="ContentTemplate" Value="{StaticResource ResourceKey=chnageTempalte}" />
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </WpfToolkit:DataGridTemplateColumn.CellTemplate>
</WpfToolkit:DataGridTemplateColumn>  

Здесь MyProperty - это свойство DataContext DataGridRow, поэтому вы можете выбрать любой уровень вложенности свойства yo. Сравнить для этой конкретной строки ... Единственным недостатком является то, что вы должны сделать это для всех столбец, который требует это

Надеюсь, это поможет

...