WPF数据网格通过绑定设置样式

本文关键字:绑定 设置 样式 数据 数据网 网格 WPF | 更新日期: 2023-09-27 17:51:25

我在WPF中使用DataGrid来显示值。现在我想要绿色和红色的行。我用datattrigger试过了,但是什么也没发生。

我的XAML

:

<DataGrid x:Name="dgAbos" ItemsSource="{Binding Source=AboList}" HorizontalAlignment="Stretch" Margin="10,30,10,10" VerticalAlignment="Stretch" Height="Auto" Width="Auto">
        <DataGrid.Columns>
              <DataGridTextColumn Header="ItemID" Binding="{Binding ItemID}" />
        </DataGrid.Columns>
        <DataGrid.RowStyle>
             <Style TargetType="DataGridRow">
                    <Style.Triggers>
                         <DataTrigger Binding="{Binding Active}" Value="false">
                               <Setter Property="Background" Value="Red"></Setter>
                         </DataTrigger>
                         <DataTrigger Binding="{Binding Active}" Value="true">
                                <Setter Property="Background" Value="Green"></Setter>
                         </DataTrigger>
                     </Style.Triggers>
               </Style>
         </DataGrid.RowStyle>
 </DataGrid>

绑定类型为:

ObservableCollection<OPCItem> AboList = new ObservableCollection<OPCItem>();

要显示的项目是OPCItem:

class OPCItem
{
    public String ItemID { get; set; }
    public String Name { get; set; }
    public String Value { get; set; }
    public DateTime DateTime { get; set; }
    public String Group { get; set; }
    private Boolean _Active;
    public String Active
    {
        get
        {
            return (_Active == true ? "Aktiv" : "Inaktiv");
        }
        set
        {
            _Active = Convert.ToBoolean(value);
        }
    }
}

如何填写列表:

  AboList.Add(new OPCItem { ItemID = Item.ItemID, Group = GroupName, Active = "true" });

但是行不改变颜色,为什么?

WPF数据网格通过绑定设置样式

您的Active属性的值永远不会是"true""false",所以触发器从来没有真正触发。您应该修改触发器的期望值,以反映Active可能采用的值(即"Aktiv""Inaktiv"):

<DataTrigger Binding="{Binding Active}" Value="Inaktiv">
    <Setter Property="Background" Value="Red"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Active}" Value="Aktiv">
    <Setter Property="Background" Value="Green"></Setter>
</DataTrigger>

这真是个坏主意:

private Boolean _Active;
public String Active
{
    get
    {
        return (_Active == true ? "Aktiv" : "Inaktiv");
    }
    set
    {
        _Active = Convert.ToBoolean(value);
    }
}

所以你设置Active为"真"或"假",你得到的结果是"Aktiv"或"Inaktiv"?这样做的自然结果是你把自己弄糊涂了,以至于你写了一个触发器,假设Active.get将返回"true"或"false",而不是"active"或"Inaktiv"。您可以通过修复Grx70建议的DataTrigger.Value属性来解决直接问题,但从长远来看,解决潜在问题并避免这样的坏习惯是更好的。特别是如果你打算在这个领域工作,你真的不想写这种东西。Active看起来像一个简单的属性,但它的行为是任何人都不会预料到的,所以任何与它交互的人都会感到惊讶,然后他们必须阅读代码来弄清楚它的作用。可以这样考虑:当您在WPF控件上看到一个名为IsEnabled的属性时,只需查看属性名称,就可以确切地知道它的含义、如何使用它以及它是什么类型。它使你的生活更轻松。

所以,我建议你把你的boolean属性改成一个实际的boolean:

private bool _isActive;
public bool IsActive {
    get { return _isActive; }
    set { _isActive = value; }
}
XAML:

<Style.Triggers>
    <DataTrigger Binding="{Binding IsActive}" Value="false">
        <Setter Property="Background" Value="Red"></Setter>
    </DataTrigger>
    <DataTrigger Binding="{Binding IsActive}" Value="true">
        <Setter Property="Background" Value="Green"></Setter>
    </DataTrigger>
</Style.Triggers>

如果你想在UI的某个地方显示字符串"Aktiv"answers"Inaktiv",你可以用另一个触发器来做,或者用一个叫做ActiveDisplayString的只读属性。

你可能应该实现INotifyPropertyChanged以及在OPCItem类;这样,你就可以在属性值进入网格后改变它们,UI会反映这些改变。