Виртуализация DataGrid, мешающая выбору связанных элементов - PullRequest
1 голос
/ 19 марта 2012

Я использую WPF DataGrid, и у меня есть свойство IsSelected ячеек, привязанных к данным в моей модели.Это прекрасно работает, если виртуализация отключена на сетке данных (VirtualizingStackPanel.IsVirtualizing="False").

Однако, как только я включаю виртуализацию, прокручивая вниз, я вижу, что некоторые ячейки больше не выделены, хотя они были выделены в коде.

Я должен использовать виртуализацию, потому что без нее загрузка сетки данных будет ОЧЕНЬ медленной.У кого-нибудь есть какие-либо предложения относительно того, как решить эту проблему?

ОБНОВЛЕНО:

Мой код (я связываю код за б / к, я не знаю, сколько столбцов мне нужно до времени выполнения):

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 голосов
/ 28 марта 2012

Похоже, это было исправлено, когда я установил для VirtualizationMode значение Standard.

Кредит отправляется в @Blam за предложение, но так как он еще не опубликовал его в качестве ответа, я публикую его. Если @Blam публикует его в качестве ответа, а не комментария, я приму его за правильный, но до этого я отмечаю его как правильный, чтобы помочь будущим пользователям.

0 голосов
/ 20 марта 2012

Глядя на ваш код, кажется, что выбор уровня ячейки имеет свойство shared source IsSelected, и каждая ячейка будет пытаться обновить это свойство (из-за привязки TwoWay), тем самым затрагивая все остальные ячейки, имеющие один и тот же источник привязки.

Вам нужно будет пересмотреть код для этого.

Можете ли вы опубликовать код класса IsSelected в нем? Может быть, мы сможем изменить способ настройки этой сетки данных.

...