【问题标题】:WPF bind DataGridTextColumns Cell string value into style setterWPF 将 DataGridTextColumns 单元格字符串值绑定到样式设置器中
【发布时间】:2016-02-11 06:57:10
【问题描述】:

我有一个绑定到列表的数据网格,每个单元格的值都绑定到唯一的布尔值。

<UserControl.Resources>
    <Style TargetType="{x:Type DataGridCell}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Have1}" Value="True">
                <Setter Property="Background" Value="#263DDE36"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding Have1}" Value="False">
                <Setter Property="Background" Value="#26FF5454"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</UserControl.Resources>

<DataGrid ItemsSource="{Binding AuditList}" AutoGenerateColumns="False" >
    <DataGrid.Columns>
        <DataGridTextColumn Header="Art1" Binding="{Binding Have1}"/>
        <DataGridTextColumn Header="Art2" Binding="{Binding Have2}"/>
        <DataGridTextColumn Header="Art2" Binding="{Binding Have3}"/>
    </DataGrid.Columns>
</DataGrid>

这很好,但我想将绑定“Have1”更改为单元格当前字符串或布尔值。

<DataTrigger Binding="{Binding DataCellsValue="True"}" Value="True">
    <Setter Property="Background" Value="#263DDE36"/>
</DataTrigger>
<DataTrigger Binding="{Binding DataCellsValue="False"}" Value="False">
    <Setter Property="Background" Value="#26FF5454"/>
</DataTrigger>

这是如何实现的?理想情况下,我只想为所有列使用一个设置器,而不为每个列单元格重复设置器。

谢谢!

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    如下使用DataTrigger

    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self},Path=Content.Text}" Value="1">
         <Setter Property="Background" Value="#263DDE36"/>
    </DataTrigger>
    

    现在只要你不定义DataGridCell's ControlTemplate 上面的绑定可以正常工作。如果您曾经定义过 Template,那么还要更改 Content.... 绑定。

    【讨论】:

    • 谢谢,这正是我们所需要的!必须在绑定值标签中使用“True”或“False”。我只提到这一点是因为我不确定 1 或 0 是否应该像您在示例中那样用作布尔值。谢谢。
    • @horseman1210 我工作的是整数列,所以我把 1 放在那里。对此感到抱歉。
    • 反对投票的人也请添加评论。
    【解决方案2】:

    为你的绑定试试这个:

    {Binding Path=PathToProperty, RelativeSource={RelativeSource AncestorType={x:Type DataGridCell}}}

    对于路径,使用单元格值的 PropertyName .. 不确定它的值/文本/内容是否...

    详情请见How do I use WPF bindings with RelativeSource?

    编辑:

    路径应该是内容。所以完整的解决方案是:

    <UserControl.Resources>
    <Style TargetType="{x:Type DataGridCell}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=Content, 
                         RelativeSource={RelativeSource AncestorType={x:Type DataGridCell}}}" 
                         Value="True">
                <Setter Property="Background" Value="#263DDE36"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=Content, 
                         RelativeSource={RelativeSource AncestorType={x:Type DataGridCell}}}"  
                         Value="False">
                <Setter Property="Background" Value="#26FF5454"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
    

    【讨论】:

    • 感谢您的链接。我确实需要更深入地了解这一点,它会派上用场的。该代码对您有用吗?我根本无法让它在那里工作。单元格的实际列是 DataGridTextColumn。我曾经这样做是复制大量代码,但每一列都包含在一个 CellStyle 中。这还重要吗?
    • 您能否添加更多网格代码,以便我可以重现它...它应该可以工作...xD
    • 谢谢。包括更多的数据网格,但就是这样!
    • 如果是绑定到datagridcell的简单值类型,那么&lt;DataTrigger Binding="{Binding}" Value="True"&gt;...就足够了,不需要相对绑定。
    • @slugster 只是一点。 在这里不起作用,因为 DataGridCell 将整个项目作为 DataContext 获取。
    猜你喜欢
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 2011-09-09
    相关资源
    最近更新 更多