【问题标题】:Change content in datagridcell on datatrigger在 datatrigger 上更改 datagridcell 中的内容
【发布时间】:2012-11-08 13:39:21
【问题描述】:

我想更改 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 进行相同操作,尽管单元格变为红色。

【问题讨论】:

    标签: c# wpf binding datatrigger datagridcell


    【解决方案1】:

    在我想根据绑定到行的属性更改单元格内容的情况下,上述方法不起作用。我想出了以下解决方案。

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

    【讨论】:

      【解决方案2】:

      这个答案真的是对@Andy 答案的评论。我似乎无法在评论中格式化代码。

      请注意,您可以在 XAML 中内联 DataTemplate 定义,以便将所有内容放在一个位置。

      <local:IsWashedStyleSelector x:Key="isWashedStyleSelector">
        <local:IsWashedStyleSelector.TrueStyle>
          <DataTemplate>
            <Button>It's true</Button>
          </DataTemplate>
        </local:IsWashedStyleSelector.TrueStyle>
        <local:IsWashedStyleSelector.FalseStyle>
          <DataTemplate>
            <Label>is false</Label>
          </DataTemplate>
        </local:IsWashedStyleSelector.FalseStyle>
      </local:IsWashedStyleSelector>
      

      当然,这是在您只想在一个地方使用这些 DataTemplate 定义时使用的。

      【讨论】:

        【解决方案3】:

        我已经删除了我之前的答案,因为使用模板选择器是一种更好的方法。

        首先,我创建了一个 DataTemplateSelector 类,该类可用于基于绑定在 DataTemplates 之间切换,注意两个属性引用了将要应用的样式,我可以在这里使用 find 资源,但我认为这是更干净,并且不需要视图设计者坚持使用硬编码的模板键。

        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>
        

        【讨论】:

        • 谢谢安迪,看起来很棒。我现在就调查一下。
        猜你喜欢
        • 2018-06-14
        • 1970-01-01
        • 1970-01-01
        • 2011-02-19
        • 1970-01-01
        • 1970-01-01
        • 2021-01-25
        • 2011-03-30
        相关资源
        最近更新 更多