使用" AlternationCount" WPF中DataGrid的属性

时间:2014-11-30 08:24:26

标签: c# wpf datagrid

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

1 个答案:

答案 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方法,您将覆盖默认的均衡行为,如果两个对象相等,则通过引用进行检查。