Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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# 如何设置datagrid行';基于单元格中可变值的背景_C#_Wpf_Colors_Datagrid_Rows - Fatal编程技术网

C# 如何设置datagrid行';基于单元格中可变值的背景

C# 如何设置datagrid行';基于单元格中可变值的背景,c#,wpf,colors,datagrid,rows,C#,Wpf,Colors,Datagrid,Rows,我目前正在使用C#WPFDataGrid DataGrid正在将我的数据库用作ItemsSource,我正在使用DataGrid列出我的订单。 例如: 大汉堡1 巨无霸1 芝士汉堡1 MCNUGGETS 2 鸡肉2 可口可乐2 百事可乐2 正如您所见,我列出了每个订单中的项目,每个项目旁边都有数字1或数字2。这些数字帮助我确定哪些项目属于哪个订单。 我的问题是如何绘制每一行,哪些项目属于特定的订单,例如,当项目与订单1关联时为红色,当项目与订单2关联时为蓝色,等等。或者,作为替代方案,只绘制每个

我目前正在使用C#WPF
DataGrid

DataGrid
正在将我的数据库用作
ItemsSource
,我正在使用
DataGrid
列出我的订单。
例如:

大汉堡1
巨无霸1
芝士汉堡1

MCNUGGETS 2
鸡肉2
可口可乐2
百事可乐2

正如您所见,我列出了每个订单中的项目,每个项目旁边都有数字1或数字2。这些数字帮助我确定哪些项目属于哪个订单。

我的问题是如何绘制每一行,哪些项目属于特定的订单,例如,当项目与订单1关联时为红色,当项目与订单2关联时为蓝色,等等。或者,作为替代方案,只绘制每个订单的最后一行(请参见下面的粗体部分)

我需要以某种方式将它们分开,因为当我将它们加载到datagrid时,它看起来很混乱

想象一下:

大汉堡1 巨无霸1
奶酪汉堡1
MCNUGGETS 2
鸡肉2
可口可乐2
百事可乐2
大汉堡3
巨无霸3
奶酪汉堡3
MCNUGGETS 3
鸡肉4
可口可乐4
百事可乐4

看起来很乱

(正如我之前所说的,如果整行不可能,是否可以只绘制每个订单的最后一行,只是在屏幕上创建可见的分隔。)

这是我到目前为止所拥有的,但这不是最优的,因为它使用硬编码值:

 <DataGrid.RowStyle>
        <Style TargetType="DataGridRow"> 
            <Style.Triggers>
                <DataTrigger Binding="{Binding NumberOfOrder}"  Value="1">
                    <Setter Property="Background" Value="Red"></Setter>
                </DataTrigger>
                <DataTrigger Binding="{Binding NumberOfOrder}"  Value="2">
                    <Setter Property="Background" Value="Green"></Setter>
                </DataTrigger>
                <DataTrigger Binding="{Binding NumberOfOrder}"  Value="3">
                    <Setter Property="Background" Value="Orange"></Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
</DataGrid.RowStyle>
如您所见,我使用的是硬编码值,如果我的
NumberOfOrder
为1,2或3,请执行下一步:绘制行,这不是一个好的解决方案,因为我将为
NumberOfOrder
使用许多不同的值

在Mat回答后编辑:

public MainWindow()
{
InitializeComponent();

    CollectionViewSource collectionViewSource = new CollectionViewSource();

    var ordersList = OrdersController.localOrders(); //ORDERS LIST

    collectionViewSource.Source = new List<OrdersController.OrdersLocal>()
    {
        foreach(var item in ordersList) 
        {
            new OrdersController.OrdersLocal() {Title = item.Title, NumberOfOrder = item.NumberOfOrder, Desc = item.Desc,   User = item.User }
        }

    };

    collectionViewSource.GroupDescriptions.Add(new PropertyGroupDescription("NumberOfOrder"));

    DataContext = collectionViewSource;
}
public主窗口()
{
初始化组件();
CollectionViewSource CollectionViewSource=新的CollectionViewSource();
var ordersList=OrdersController.localOrders();//订单列表
collectionViewSource.Source=新列表()
{
foreach(ordersList中的var项)
{
new OrdersController.OrdersLocal(){Title=item.Title,NumberOfOrder=item.NumberOfOrder,Desc=item.Desc,User=item.User}
}
};
collectionViewSource.GroupDescriptions.Add(新属性GroupDescription(“NumberOfOrder”);
DataContext=collectionViewSource;
}
使用a根据a)订单号和b)订单的最后一行更改背景。您可能希望在模型中添加一个属性,说明该行是否是该顺序的最后一行

尝试类似的方法(未经测试):


...
使用a根据a)订单号和b)订单的最后一行更改背景。您可能希望在模型中添加一个属性,说明该行是否是该顺序的最后一行

尝试类似的方法(未经测试):


...

您可以尝试将绑定与值转换器结合使用

我这样做是为了单元样式:

<Style TargetType="DataGridCell">
    <Setter Property="Background"
            Value="{Binding State, Converter={x:Static l:Converters.CoupleStateConverter}}" />
                    </Style>

因此,转换器根据状态返回背景色(在我的示例中为int)。这与您的需求类似


如您所见,单元格的数据上下文是行的值,因此我可以在示例中绑定到属性状态。我假设这对该行有效,因此数据上下文将是此行中要显示的项目

您可以尝试将绑定与值转换器结合使用

我这样做是为了单元样式:

<Style TargetType="DataGridCell">
    <Setter Property="Background"
            Value="{Binding State, Converter={x:Static l:Converters.CoupleStateConverter}}" />
                    </Style>

因此,转换器根据状态返回背景色(在我的示例中为int)。这与您的需求类似


如您所见,单元格的数据上下文是行的值,因此我可以在示例中绑定到属性状态。我假设这对该行有效,因此数据上下文将是此行中要显示的项目

您可以使用CollectionViewSource并按序号分组: XAML:


代码隐藏:

 CollectionViewSource collectionViewSource = new CollectionViewSource();
        collectionViewSource.Source = new List<RowItem>()
            {
              new RowItem() {NumberOfOrder =1, Name ="kong foo" },
              new RowItem() {NumberOfOrder =1,Name ="asdf" },
              new RowItem() {NumberOfOrder =2,Name ="asdf" },
              new RowItem() {NumberOfOrder =3,Name ="foo"}
            };


        collectionViewSource.GroupDescriptions.Add(new PropertyGroupDescription("NumberOfOrder"));

        DataContext = collectionViewSource;
CollectionViewSource CollectionViewSource=new CollectionViewSource();
collectionViewSource.Source=新列表()
{
new RowItem(){NumberOfOrder=1,Name=“kong foo”},
new RowItem(){NumberOfOrder=1,Name=“asdf”},
new RowItem(){NumberOfOrder=2,Name=“asdf”},
新建行项目(){NumberOfOrder=3,Name=“foo”}
};
collectionViewSource.GroupDescriptions.Add(新属性GroupDescription(“NumberOfOrder”);
DataContext=collectionViewSource;

您可以使用CollectionViewSource和group by NumberOfOrder: XAML:


        <DataGrid ItemsSource="{Binding}" >
        <DataGrid.GroupStyle>
            <!-- Style for groups at top level. -->
            <GroupStyle>
                <GroupStyle.ContainerStyle>
                    <Style TargetType="{x:Type GroupItem}">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type GroupItem}">
                                    <Expander IsExpanded="True">
                                        <Expander.Header>
                                            <DockPanel>
                                                <TextBlock FontWeight="Bold"
                                                           Text="{Binding Path=Name}" />
                                            </DockPanel>
                                        </Expander.Header>
                                        <Expander.Content>
                                            <ItemsPresenter />
                                        </Expander.Content>
                                    </Expander>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </GroupStyle.ContainerStyle>
            </GroupStyle>
        </DataGrid.GroupStyle>
    </DataGrid>
 CollectionViewSource collectionViewSource = new CollectionViewSource();
        collectionViewSource.Source = new List<RowItem>()
            {
              new RowItem() {NumberOfOrder =1, Name ="kong foo" },
              new RowItem() {NumberOfOrder =1,Name ="asdf" },
              new RowItem() {NumberOfOrder =2,Name ="asdf" },
              new RowItem() {NumberOfOrder =3,Name ="foo"}
            };


        collectionViewSource.GroupDescriptions.Add(new PropertyGroupDescription("NumberOfOrder"));

        DataContext = collectionViewSource;