2017-06-20 121 views
0

我有兩個列表Ints,我需要將它們並排放置在兩個垂直列中。在數字不匹配的地方,我需要高亮這個(一個或兩個單元格,無論哪個,改變背景或字體顏色,哪個都沒關係)。以編程方式更改單元格顏色

我最初是通過側ListBoxes側面顯示這些,但是當我發現很難改變一個特定的細胞編程我開始尋找DataGrid,顏色,但這也證明難以+許多我發現網上出現了導遊是Windows窗體的重點,而不是WPF。

對於我認爲是一項簡單的任務,推薦的控件是什麼,請指導我如何識別這些不同的單元格/索引並更新其外觀。

額外信息:兩個列表不會太長(每個< 15)。

我試過這個時,我正在使用datagrid;

dgdResults.Rows[0].Cells[0].Style.BackColor = Color.Red; 

回答

1

數據網格/列表框的ItemsControls,做工精良跟單託收。我建議使用來自list1和list2的一對項目創建額外的對象列表,其中屬性指示不同的項目,然後在UI中顯示該列表。

var L1 = new List<int> {1, 2, 3, 4, 5}; 
var L2 = new List<int> {1, 2, 0, 4, 5}; 
var results = L1.Zip(L2, (i, j) => new {Previous = i, Current = j, IsDifferent = i != j}); 
ListResults.ItemsSource = results; 
<ItemsControl Name="ListResults"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <UniformGrid Rows="1"> 
       <UniformGrid.Style> 
        <Style TargetType="UniformGrid"> 
         <Style.Triggers> 
          <DataTrigger Binding="{Binding Path=IsDifferent}" Value="true"> 
          <Setter Property="Background" Value="Crimson"/> 
          </DataTrigger> 
         </Style.Triggers> 
        </Style> 
       </UniformGrid.Style> 
       <Label Content="{Binding Path=Previous}"/> 
       <Label Content="{Binding Path=Current}"/> 
      </UniformGrid> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

diff


替代與數據表/數據網格

var L1 = new List<int> {1, 2, 3, 4, 5}; 
var L2 = new List<int> {1, 2, 0, 4, 5}; 

var dt = new DataTable 
      { 
       Columns = 
       { 
        {"Previous", typeof (int)}, 
        {"Current", typeof (int)}, 
        {"IsDifferent", typeof (bool)}, 
       } 
      }; 
for (int x = 0; x < L1.Count; x++) 
    dt.Rows.Add(L1[x], L2[x], L1[x] != L2[x]); 

DgResults.ItemsSource = dt.DefaultView; 
<DataGrid Name="DgResults" AutoGenerateColumns="False" ColumnWidth="*" IsReadOnly="True"> 
    <DataGrid.RowStyle> 
     <Style TargetType="DataGridRow"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=IsDifferent}" Value="true"> 
        <Setter Property="Background" Value="Crimson"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </DataGrid.RowStyle> 

    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding Path=Previous}"/> 
     <DataGridTextColumn Binding="{Binding Path=Current}"/> 
    </DataGrid.Columns> 
</DataGrid> 

屬性IsDifferent用於DataTrigger以更改背景

+0

真棒和直接!有沒有一種方法來修改'ItemSource'行來使用DataTable與列Previous,Current,IsDifferent替代? – windowskm

+0

@windowskm,是:'ListResults.ItemsSource = myDataTable.DefaultView;' – ASh

0

在你App.xaml中創建您要使用該行那不是相同的風格。

<Style TargetType="DataGridRow"> 
    <Setter Property="Background" Value="Red"/> 
</Style> 

如果再枚舉行,並找到一個不匹配,你可以設置樣式像這樣

Style style = Application.Current.FindResource("DataGridRow") as Style; 
row.Style = style;