C# WPF DataGrid按绑定设置样式
我在WPF中使用DataGrid来显示值。 现在我想要绿色和红色的一排。我用DataTrigger试过了,但什么也没发生 我的XAML:C# WPF DataGrid按绑定设置样式,c#,wpf,xaml,datagrid,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 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>
我如何填写列表:
AboList.Add(new OPCItem { ItemID = Item.ItemID, Group = GroupName, Active = "true" });
但是行不会改变颜色,为什么?活动属性的值永远不会为true或false,因此触发器永远不会实际触发。您应该修改触发器的预期值,以反映活动可能采用的值,即Aktiv和Inaktiv:
活动属性的值永远不会为true或false,因此触发器永远不会实际触发。您应该修改触发器的预期值,以反映活动可能采用的值,即Aktiv和Inaktiv:
这真是个坏主意:
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看起来像一个简单的属性,但它的行为并不是任何人都会想到的,因此与它交互的任何人都会感到惊讶,然后他们必须阅读代码才能了解它的作用。这样考虑:当您在WPF控件上看到一个名为IsEnabled的属性时,只需查看属性名称,您就可以确切地知道它的含义、使用方法以及类型。它让你的生活更轻松
因此,我建议您将布尔属性设置为实际的布尔值:
private bool _isActive;
public bool IsActive {
get { return _isActive; }
set { _isActive = value; }
}
XAML:
如果希望在UI中的某个位置显示字符串Aktiv和Inaktiv,则可以使用另一个触发器,或者使用名为ActiveDisplayString之类的只读属性
您可能也应该在OPCItem类中实现;这样,您可以在属性值进入网格后更改它们,UI将反映这些更改 这真是个坏主意:
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看起来像一个简单的属性,但它的行为并不是任何人都会想到的,因此与它交互的任何人都会感到惊讶,然后他们必须阅读代码才能了解它的作用。这样考虑:当您在WPF控件上看到一个名为IsEnabled的属性时,只需查看属性名称,您就可以确切地知道它的含义、使用方法以及类型。它让你的生活更轻松
因此,我建议您将布尔属性设置为实际的布尔值:
private bool _isActive;
public bool IsActive {
get { return _isActive; }
set { _isActive = value; }
}
XAML:
如果希望在UI中的某个位置显示字符串Aktiv和Inaktiv,则可以使用另一个触发器,或者使用名为ActiveDisplayString之类的只读属性
您可能也应该在OPCItem类中实现;这样,您可以在属性值进入网格后更改它们,UI将反映这些更改
private bool _isActive;
public bool IsActive {
get { return _isActive; }
set { _isActive = value; }
}
<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>