MVVM WPF动态数据网格

MVVM WPF动态数据网格,wpf,mvvm,datagrid,datatable,dataview,Wpf,Mvvm,Datagrid,Datatable,Dataview,我正在视图模型中动态创建两个数据表。 在视图中显示它们之前,我要将一个数据表中的每个单元格值与第二个数据表中的相同单元格进行比较。 我的问题是,我想为不同的单元格提供不同的背景色。我如何通过编程来实现它 以下是第一个数据网格: <GroupBox Header="Xml 1 Details" Margin="10,10,10,10" Grid.Row="1" Grid.ColumnSpan="4" Grid.Column="0"> <ScrollViewer

我正在视图模型中动态创建两个数据表。 在视图中显示它们之前,我要将一个数据表中的每个单元格值与第二个数据表中的相同单元格进行比较。 我的问题是,我想为不同的单元格提供不同的背景色。我如何通过编程来实现它

以下是第一个数据网格:

 <GroupBox Header="Xml 1 Details" Margin="10,10,10,10" Grid.Row="1" Grid.ColumnSpan="4" Grid.Column="0">
        <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>

                <GroupBox x:Name="GridGroupBox"
                  Grid.Column="0"
                  Header="{Binding TableName}">
                    <DataGrid x:Name="DataGrid" Margin="5,5,5,5"
                      ItemsSource="{Binding GenericDataTable}"
                      attachedBehaviors:DataGridColumnsBehavior.BindableColumns="{Binding GridColumns}"                                 
                      AutoGenerateColumns="False"
                      EnableRowVirtualization="False">                            
                    </DataGrid>
                </GroupBox>
            </Grid>
        </ScrollViewer>
    </GroupBox>
    <GroupBox Header="Xml 2 Details" Margin="10,20,10,10" Grid.Row="2" Grid.ColumnSpan="4" Grid.Column="0">
        <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>


                <GroupBox x:Name="GridGroupBox2" 
                Grid.Column="0"
                Header="{Binding TableName}">

                    <DataGrid x:Name="DataGrid2" Margin="5,5,5,5" 
                    ItemsSource="{Binding GenericDataTable2}"
                    attachedBehaviors:DataGridColumnsBehavior.BindableColumns="{Binding GridColumns2}"                                 
                    AutoGenerateColumns="False"
                    EnableRowVirtualization="False"
                    />                    
                </GroupBox>
            </Grid>
        </ScrollViewer>
    </GroupBox>

第二个数据网格:

 <GroupBox Header="Xml 1 Details" Margin="10,10,10,10" Grid.Row="1" Grid.ColumnSpan="4" Grid.Column="0">
        <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>

                <GroupBox x:Name="GridGroupBox"
                  Grid.Column="0"
                  Header="{Binding TableName}">
                    <DataGrid x:Name="DataGrid" Margin="5,5,5,5"
                      ItemsSource="{Binding GenericDataTable}"
                      attachedBehaviors:DataGridColumnsBehavior.BindableColumns="{Binding GridColumns}"                                 
                      AutoGenerateColumns="False"
                      EnableRowVirtualization="False">                            
                    </DataGrid>
                </GroupBox>
            </Grid>
        </ScrollViewer>
    </GroupBox>
    <GroupBox Header="Xml 2 Details" Margin="10,20,10,10" Grid.Row="2" Grid.ColumnSpan="4" Grid.Column="0">
        <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>


                <GroupBox x:Name="GridGroupBox2" 
                Grid.Column="0"
                Header="{Binding TableName}">

                    <DataGrid x:Name="DataGrid2" Margin="5,5,5,5" 
                    ItemsSource="{Binding GenericDataTable2}"
                    attachedBehaviors:DataGridColumnsBehavior.BindableColumns="{Binding GridColumns2}"                                 
                    AutoGenerateColumns="False"
                    EnableRowVirtualization="False"
                    />                    
                </GroupBox>
            </Grid>
        </ScrollViewer>
    </GroupBox>

以编程方式创建它们:

    private void GenerateFirstXmlDynamicColumns(DataTable dt, List<string> cols)
    {

        GridColumns = new ObservableCollection<DataGridColumn>();

        foreach (DataColumn col in dt.Columns)
        {

            GridColumns.Add(new DataGridTextColumn
            {
                Header = col.ColumnName,
                Binding = new Binding(col.ColumnName)
            });
        }

        RaisePropertyChanged("GridColumns");
        GenericDataTable = dt;
        RaisePropertyChanged("GenericDataTable");
    }

    private void GenerateSecondXmlDynamicColumns(DataTable dt, List<string> cols)
    {
        GridColumns2 = new ObservableCollection<DataGridColumn>();

        foreach (DataColumn col in dt.Columns)
        {

            GridColumns2.Add(new DataGridTextColumn
            {
                Header = col.ColumnName,
                Binding = new Binding(col.ColumnName)
            });
        }

        RaisePropertyChanged("GridColumns2");
        GenericDataTable2 = dt;
        RaisePropertyChanged("GenericDataTable2");
    }
private void GenerateFirstXmlDynamicColumns(数据表dt,列表列)
{
GridColumns=新的ObservableCollection();
foreach(dt.列中的数据列列列)
{
添加(新的DataGridTextColumn
{
Header=col.ColumnName,
绑定=新绑定(列名称)
});
}
RaisePropertyChanged(“GridColumns”);
GenericDataTable=dt;
RaisePropertyChanged(“GenericDataTable”);
}
私有void GenerateSecondXmlDynamicColumns(数据表dt,列表列)
{
GridColumns2=新的ObservableCollection();
foreach(dt.列中的数据列列列)
{
添加(新的DataGridTextColumn
{
Header=col.ColumnName,
绑定=新绑定(列名称)
});
}
RaisePropertyChanged(“GridColumns2”);
一般数据表2=dt;
RaisePropertyChanged(“GenericDataTable2”);
}
在这里,我比较单元格,我想更改不同单元格的背景颜色:

private void CompareData()
    {
        for (int i = 0; i < GenericDataTable.Rows.Count; i++)
        {
            for (int j = 0; j < GenericDataTable.Columns.Count; j++)
            {
                if (!GenericDataTable.Rows[i][j].Equals(GenericDataTable2.Rows[i][j]))//if cells are different
                {

                }
            }

        }     
    }
private void CompareData()
{
for(int i=0;i
从索引中获取数据网格单元格:

public DataGridCell GetCell(DataGrid dg, int row, int column)
    {
        DataGridRow rowContainer = GetRow(dg, row);
        if (rowContainer != null)
        {
            DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);
            if (presenter == null)
            {
                dg.ScrollIntoView(rowContainer, dg.Columns[column]);
                presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);
            }
            DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
            return cell;
        }
        return null;
    }

    public static DataGridRow GetRow(DataGrid dg, int index)
    {
        DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
        if (row == null)
        {
            dg.UpdateLayout();
            dg.ScrollIntoView(dg.Items[index]);
            row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
        }
        return row;
    }

    public static T GetVisualChild<T>(Visual parent) where T : Visual
    {
        if (parent == null) return null;
        T child = default(T);
        int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
        for (int i = 0; i < numVisuals; i++)
        {
            Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
            child = v as T;
            if (child == null)
            {
                child = GetVisualChild<T>(v);
            }
            if (child != null)
            {
                break;
            }
        }
        return child;
    }
var cell = GetCell(DataGrid2, i, j);
cell.Background = color;
以下是解决方案:

在xaml中使用它:



在这里获得帮助的方法是先尝试,展示代码,然后人们会乐意提供帮助。谢谢,问题是我无法直接访问我的datagrid。我正在动态构建它:public observeCollection GridColumns{get;private set;}public DataTable GenericDataTable{get;private set;}public observeCollection GridColumns2{get;private set;}public DataTable GenericDataTable2{get;private set;}好的,您可以在DataGridColumn中使用CellTemplate。但是需要为绑定创建新字段(bool Different{get;set;})你有没有一个例子来说明我如何更改一个特定的单元格?比如:但是有一个问题是如何在单元格中存储一个新字段,而不是在数据行中。也许它不合适