DataGrid/ListBox 是 ItemsControls,可以很好地与单个集合一起使用。我建议使用 list1 和 list2 and 属性中的一对项目创建额外的对象列表,该属性指示不同的项目,然后在 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>
DataTable/DataGrid 的替代方案
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中用于改变背景