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" });
但是行不改变颜色,为什么?
您的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会反映这些改变。