Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF DataGrid按绑定设置样式_C#_Wpf_Xaml_Datagrid - Fatal编程技术网

C# WPF DataGrid按绑定设置样式

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">

我在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>
我如何填写列表:

  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>