WPF DataGrid通过绑定设置样式

时间:2016-06-27 13:09:39

标签: c# wpf xaml datagrid

我在WPF中使用DataGrid来显示值。 现在我想要绿色和红色的行。我用DataTrigger试了一下,但没有任何事情发生。

我的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" });

但这行没有改变颜色,为什么?

2 个答案:

答案 0 :(得分:3)

numpy.tile属性的值永远不会是Active,也不会是"true",因此触发器永远不会被触发。您应该修改触发器的预期值,以反映"false"可能采用的值(Active"Aktiv"):

"Inaktiv"

答案 1 :(得分:2)

这是一个非常糟糕的主意:

private Boolean _Active;

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

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

因此,我建议您将布尔属性设为实际布尔值:

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”和“Inaktiv”,你可以使用另一个触发器,或者使用名为ActiveDisplayString之类的只读属性。

您应该在OPCItem课程中实施INotifyPropertyChanged;这样,您可以在网格中更改属性值,并且UI将反映更改。