我对DataGrid的“AlternationCount”属性有疑问。 我为行的背景设置了两种颜色,现在当我选择其中一行并移动滚动条时,每隔一行也会被选中! 我设置了AlternationCount =“2”和SelectionMode =“Single”。
有人可以解决这个问题吗?
C#代码:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
var data1 = new Test { Test1 = "TestCell1", Test2 = "TestCell2", Test3 = "TestCell3" };
var data2 = new Test { Test1 = "TestCell1", Test2 = "TestCell2", Test3 = "TestCell3" };
for (int i = 0; i < 10; i++)
{
dataGrid1.Items.Add(data1);
dataGrid1.Items.Add(data2);
}
}
public class Test
{
public string Test1 { get; set; }
public string Test2 { get; set; }
public string Test3 { get; set; }
}
的Xaml:
<DataGrid AlternationCount="2" SelectionMode="Single"
Name="dataGrid1"
RowBackground="Beige"
AlternatingRowBackground="linen"
DataContext="{Binding}"
HorizontalAlignment="Left" Height="239.334"
Margin="39.333,37.333,0,0"
VerticalAlignment="Top" Width="432">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=Test1}" Header="Header1" />
<DataGridTextColumn Binding="{Binding Path=Test2}" Header="Header2" />
<DataGridTextColumn Binding="{Binding Path=Test3}" Header="Header3" />
</DataGrid.Columns>
</DataGrid>
答案 0 :(得分:1)
看看以下代码:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
for (int i = 0; i < 10; i++)
{
dataGrid1.Items.Add(new Test { Test1 = "TestCell1", Test2 = "TestCell2", Test3 = "TestCell3" });
dataGrid1.Items.Add(new Test { Test1 = "TestCell1", Test2 = "TestCell2", Test3 = "TestCell3" });
}
}
如果您在应用程序中尝试该代码,您将看到单个数据行的选择正常。代码中的问题是您反复分配对象的同一实例。因此,在以下行中,您将创建一个这样的新对象:
var data1 = new Test { Test1 = "TestCell1", Test2 = "TestCell2", Test3 = "TestCell3" };
对象data1
被分配给您的dataGrid1 10次。单击数据行时,gridcontrol将使用equal
方法检查每一行。您没有在equals
类中实现Test
,这意味着当它们的引用相等时您的对象是相等的,因为您分配了相同的对象(因此引用了相同的对象)10次。
来自msdn的更多信息:
如果当前实例是引用类型,则Equals(Object)方法测试引用相等性,并且对Equals(Object)方法的调用等效于对ReferenceEquals方法的调用。引用相等意味着比较的对象变量引用同一个对象。
IEquatable的实现: 要检查对象是否等于另一个对象,可以使用IEquatable接口,如下所示:
public class Test : IEquatable<Test>
{
public string Test1 { get; set; }
public string Test2 { get; set; }
public string Test3 { get; set; }
public bool Equals(Test other)
{
if (other == null) return false;
return Test1.Equals(other.Test1)
&& Test2.Equals(other.Test2)
&& Test3.Equals(other.Test3);
}
}
通过重写equals方法,您将覆盖默认的均衡行为,如果两个对象相等,则通过引用进行检查。