DataGrid虚拟化干扰绑定项目选择

时间:2012-03-19 18:24:52

标签: c# wpf data-binding datagrid virtualization

我使用的是WPF DataGrid,我的单元格的IsSelected属性绑定到模型中的数据。如果在数据网格(VirtualizingStackPanel.IsVirtualizing="False")上关闭虚拟化,这可以正常工作。

但是,只要我打开虚拟化,向下滚动就会看到虽然在代码中选择了一些单元格但不再选中它们。

我必须使用虚拟化,因为没有它我的数据网格加载太慢了。有没有人对如何解决这个问题有任何建议?

更新:

我的代码(我在b / c后面的代码中绑定我不知道在运行时需要多少列):

for (int i = 0; i < this.CurrentData.Data[0].Length; i++)
    {
        TheGrid.Columns.Add(
            new DataGridTextColumn
            {
                Header = (this.CurrentData.Rank > 1) ? string.Format(this.culture, headerFormatString, i + 1) : string.Empty,
                Binding = new Binding(string.Format("[{0}].DataValue", i)) { ValidatesOnDataErrors = true, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged },
                Width = DataGridLength.Auto,
                ElementStyle = new Style
                {
                    TargetType = typeof(TextBlock),
                    Triggers = { this.errorTrigger }
                },

                EditingElementStyle = new Style
                {
                    TargetType = typeof(TextBox),
                    Triggers = { this.errorTrigger }
                },

                CellStyle = new Style
                {
                    TargetType = typeof(DataGridCell),
                    Setters =
                    {
                        new Setter
                        {
                            Property = DataGridCell.IsSelectedProperty,
                            Value = new Binding(string.Format("[{0}].IsSelected", i)) { Mode = BindingMode.TwoWay, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged },
                        }
                    },
                }
            });
    }

和我的IsSelected属性:

private bool isSelected = false;
    public bool IsSelected
    {
        get
        {
            return this.isSelected;
        }

        set
        {
            this.isSelected = value;
            OnPropertyChanged("IsSelected");
        }
    }

2 个答案:

答案 0 :(得分:0)

查看您的代码,似乎单元格级别选择具有共享IsSelected属性,并且每个单元格都会尝试更新此属性(由于TwoWay绑定)从而影响共享相同源绑定的所有其他小区。

您需要修改此代码。

您可以在其中发布IsSelected类的代码吗?也许我们可以改变这个数据网格的设置方式。

答案 1 :(得分:0)

当我将VirtualizationMode设置为Standard时,似乎解决了这个问题。

@Blam获得了建议,但由于他还没有将其作为答案发布,但我发帖了。如果@Blam发布他的答案而不是评论,我会接受正确的,但在此之前,我将此标记为正确,以帮助未来的用户。