2016-02-03 73 views
0

我在我的視圖模型中動態創建兩個數據表。 在我將它們顯示在視圖中之前,我將一個DataTable中的每個單元格值與第二個DataTable中的同一個單元格進行比較。 我的問題是我想提供不同的單元格不同的背景顏色。我怎樣才能做到這一點?MVVM WPF動態數據網格

這裏是第一個DataGrid:

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

第二個DataGrid:

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

       } 
      } 

     }  
    } 
+0

獲得幫助這裏的方法是嘗試第一,顯示你的代碼,然後人都樂於幫助。 – kenny

回答

0

這裏是解決方案:

 
Create a MultiConverter:

public object Convert(object[] values, 
Type targetType, object parameter,  
CultureInfo culture) 
    { 
     var dataContext = values[0]; 
     var dg = (DataGrid)values[1]; 
     var i = (DataGridCell)values[2]; 
     var col = i.Column.DisplayIndex; 
     var row = dg.Items.IndexOf(i.DataContext); 
     if (row >= 0 && col >= 0) 
     { 
      DataTable td1 = ((CheckXmlAppWpf.ViewModel.MainWindowViewModel) (dataContext)).GenericDataTable; 
      DataTable td2 = ((CheckXmlAppWpf.ViewModel.MainWindowViewModel)(dataContext)).GenericDataTable2; 

      if (!td1.Rows[row][col].Equals(td2.Rows[row][col])) 
      { 
       GetCell(dg, row, col).Background = Brushes.Yellow; 
      } 
     } 

     return SystemColors.AppWorkspaceColor; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new System.NotImplementedException(); 
    } 
} 

用它在XAML:

<DataGrid x:Name="DataGrid" Margin="5,5,5,5" ItemsSource="{Binding GenericDataTable}" attachedBehaviors:DataGridColumnsBehavior.BindableColumns="{Binding GridColumns}" AutoGenerateColumns="False" EnableRowVirtualization="False"> <DataGrid.Resources> <Style TargetType="DataGridCell"> <Setter Property="Background"> <Setter.Value> <MultiBinding Converter="{StaticResource NameToBrushMultiValueConverter}" > <MultiBinding.Bindings> <Binding RelativeSource="{RelativeSource AncestorType=Window}" Path="DataContext" /> <Binding RelativeSource="{RelativeSource AncestorType=DataGrid}"></Binding> <Binding RelativeSource="{RelativeSource Self}"/> </MultiBinding.Bindings> </MultiBinding> </Setter.Value> </Setter> </Style> </DataGrid.Resources> </DataGrid>

0

從指標獲得的DataGrid單元格:

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; 
+0

謝謝,問題是我沒有直接訪問我的數據網格。我正在動態構建它:public ObservableCollection GridColumns {get;私人設置; } public DataTable GenericDataTable {get;私人設置; } public ObservableCollection GridColumns2 {get;私人設置; } public DataTable GenericDataTable2 {get;私人設置; } – Rom

+0

好的,你可以在你的DataGridColumn中使用CellTemplate。但是需要爲綁定創建新的字段(bool不同的{get; set;}) –

+0

你有沒有一個例子可以改變一個特定的單元格? – Rom