我在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" });
但这行没有改变颜色,为什么?
答案 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将反映更改。