1

DataGridCellのコンテンツを変更したい。datagridviewに次のような列があります

<DataGridCheckBoxColumn CellStyle="ChangeContentOfCellSstyle"...

次に、次のようなDataTriggerがあります。

<Style TargetType="DataGridCell" x:Key="ChangeContentOfCellSstyle">
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsWashed}" Value="True">
            <Setter Property="Content" Value="The new value for the cell."/> 
            <Setter Property="Background" Value="Red"/> //sets the background of the cell to red just to show the trigger is working
        </DataTrigger>
    </Style.Triggers>
</Style>

しかし、セルの内容は変更されていません。セルが赤くなりますが、DataGridTextColumnで同じことを試しても違います。

4

3 に答える 3

1

テンプレートセレクターを使用する方がはるかに優れているため、以前の回答を削除しました。

最初に、バインディングに基づいて DataTemplate を切り替えるために使用できる DataTemplateSelector クラスを作成します。適用されるスタイルへの参照を取り込む 2 つのプロパティに注意してください。ここでリソースの検索を使用することもできましたが、これはよりクリーンでありません。ビュー デザイナーがハード コーディングされたテンプレート キーに固執する必要はありません。

public class IsWashedStyleSelector : DataTemplateSelector
{

    public DataTemplate TrueStyle { get; set; }
    public DataTemplate FalseStyle { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        TestClass targetItem = item as TestClass;
        if (targetItem != null)
        {
            return targetItem.IsWashed ? TrueStyle : FalseStyle;
        }
        return base.SelectTemplate(item, container);
    }
}

このテンプレート セレクターを使用するには、2 つのデータ テンプレートを定義し、xaml リソースでセレクターをインスタンス化する必要があります。

<DataTemplate x:Key="styleIsWashedTrue">
    <Button>It's true</Button>
</DataTemplate>
<DataTemplate x:Key="styleIsWashedFalse">
    <Label>is false</Label>
</DataTemplate>

<local:IsWashedStyleSelector x:Key="isWashedStyleSelector"  TrueStyle="{StaticResource styleIsWashedTrue}" FalseStyle="{StaticResource styleIsWashedFalse}"/>

最後に、セレクターを DataGridTemplateColumn で使用できます。

<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridCheckBoxColumn Binding="{Binding IsWashed}"/>
            <DataGridTextColumn Binding="{Binding Text}"/>
            <DataGridTemplateColumn CellTemplateSelector="{StaticResource isWashedStyleSelector}"/>
        </DataGrid.Columns>
    </DataGrid>
于 2012-11-20T14:29:14.460 に答える
0

行にバインドされたプロパティに基づいてセルの内容を変更したいという私の状況では、上記は機能しませんでした。次の解決策を思いつきました。

<DataGridTemplateColumn  >
<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <ContentPresenter   
                    Style="{StaticResource LockedStyle}" Content="{Binding}">
        </ContentPresenter>
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>

リソース ディクショナリで次のスタイルを使用します。

  <DataTemplate x:Key="LockedTemplate">
    <TextBlock FontFamily="Segoe MDL2 Assets" Text="&#xE72E;" ></TextBlock>
</DataTemplate>
<DataTemplate x:Key="UnLockedTemplate">
    <TextBlock FontFamily="Segoe MDL2 Assets" Text="&#xE785;"></TextBlock>
</DataTemplate>
<DataTemplate x:Key="NoneTemplate"></DataTemplate>
 <Style x:Key="LockedStyle" TargetType="ContentPresenter">
    <Setter Property="ContentTemplate" Value="{StaticResource NoneTemplate}"/>
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsLocked}" Value="true">
            <Setter Property="ContentTemplate" Value="{StaticResource LockedTemplate}"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding IsLocked}" Value="false">
            <Setter Property="ContentTemplate" Value="{StaticResource UnLockedTemplate}"/>
        </DataTrigger>
    </Style.Triggers>
</Style>
         
于 2021-06-13T10:19:32.107 に答える