【问题标题】:Silverlight: I have a datagrid that will only let me select the first row - i have no idea whySilverlight:我有一个只能让我选择第一行的数据网格 - 我不知道为什么
【发布时间】:2011-03-23 15:16:42
【问题描述】:

这是我的代码中的一个奇怪的错误,我不知道是什么原因造成的。

构建数据网格的代码似乎不错。它是从具有功能的数据网格中复制而来的。原因似乎是该控件是其子控件的控件。

编辑:在我的挫败感中,我删除了导航框架和我的控件之间的任何控件。我的控件使用基于通用类的数据上下文,并且我已经通过单元测试验证了它是否按预期工作 - 除了设置 List 属性的加载方法之外,它基本上是空的。 load 方法有效并返回一个填充的 observable 集合。

一切都加载和绑定。交互用于连接网格和我的详细信息表单。

但是,唯一可选择的单元格是第一行中的单元格 - 但是,当您将鼠标悬停在其他行上时,它们会突出显示。他们只是不响应点击事件。

最大的问题是:是否有人知道可能导致这种行为的任何条件(即控件的嵌套)? 例如,我知道将手风琴控件和 scrollViewers 结合使用会产生各种讨厌的副作用。

编辑:我尝试替换与此控件一起使用的控件(它们继承了相同的基础对象,因此它们是兼容的。当我这样做时,我得到了相同的损坏行为。这意味着 viewmodel 有问题。 .. 或更多可能是绑定(但数据正在出现:/)...

数据网格的代码:

<sdk:DataGrid   
                    AutoGenerateColumns="False" 
                    x:Name="dgBankCodes" 
                    ItemsSource="{Binding List}" 
                    IsReadOnly="True" 
                    SelectionMode="Single" >

                <sdk:DataGrid.Columns>
                    <sdk:DataGridTextColumn Binding="{Binding Code}" CanUserSort="True" Header="Bank Code" IsReadOnly="True"/>
                    <sdk:DataGridTextColumn Binding="{Binding Name}" CanUserSort="True" Header="Name" IsReadOnly="True"/>
                    <sdk:DataGridTextColumn Binding="{Binding SortCode}" CanUserSort="True" Header="Sort Code" IsReadOnly="True"/>
                    <sdk:DataGridTextColumn Binding="{Binding AccountNumber}" CanUserSort="True" Header="Act No" IsReadOnly="True"/>
                    <sdk:DataGridTextColumn Binding="{Binding Description}" CanUserSort="True" Header="Description" IsReadOnly="True"/>
                    <sdk:DataGridTextColumn Binding="{Binding IBAN}" Header="IBAN" IsReadOnly="True"/>
                    <sdk:DataGridTextColumn Binding="{Binding BIC}" CanUserSort="True" Header="BIC" IsReadOnly="True"/>
                </sdk:DataGrid.Columns>
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="SelectionChanged">
                        <i:InvokeCommandAction 
                            Command="{Binding SelectObjectCommand}" 
                            CommandParameter="{Binding SelectedItem, ElementName=dgBankCodes}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </sdk:DataGrid>

【问题讨论】:

    标签: silverlight datagrid


    【解决方案1】:

    当您覆盖对象类的 Equals 方法时会发生这种情况。确保每个对象在重写的 Equals 方法中都是唯一的

    【讨论】:

    • 啊,您可能对此很感兴趣。我刚刚注意到我的单元测试在生成对象的 T4 模板上失败了。我忘了在基类上测试相等性。
    • 您还应该检查是否也覆盖了 GetHashCode
    • 是的,我已经正确覆盖了获取哈希码。很高兴你提出这个问题,因为我很惊讶数据网格使用 Equals 来比较行,而大多数事情都使用 GetHashCode 的实现。我正在使用代码生成,因此获取哈希码很简单,Equals 更有趣,因为需要在继承的情况下进行分支,否则您最终会得到 doign 对象。在这种情况下,Equals 将始终为 false。
    猜你喜欢
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多