Привязка WPF происходит самопроизвольно после короткого использования - PullRequest
1 голос
/ 24 ноября 2010

Если бы кто-то скомпилировал и выполнил следующий код, то обнаружил бы, что выбор и / или отмена выбора строки приводит к записи строки в окно вывода (поскольку более тщательный анализ указанного кода заставит поверить в это).

После короткого времени изменения выбранной строки сетки с помощью клавиш со стрелками (удерживая стрелки вверх и вниз соответственно, чтобы перебрать весь набор данных несколько раз), один из них будет шокирован (как я)заметить, что выходные сообщения прекращаются, даже если они продолжают циклически проходить по строкам сетки.

Я пытаюсь достичь чего-то похожего на то, что было дано в этом ответе .

Я абсолютно сбит с толку.Что может привести к самопроизвольному отказу привязок в моей сетке?Любая помощь здесь будет НАМНОГО оценена !!Кроме того, если у кого-то есть время воспроизвести это, пожалуйста, прокомментируйте свои выводы.

XAML:

<Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="300" Width="300">
    <Grid>
        <DataGrid Name="TheGrid">
            <DataGrid.Resources>
                <Style TargetType="{x:Type DataGridRow}">
                    <Setter Property="IsSelected" 
                            Value="{Binding Mode=TwoWay, Path=IsSelected}"/>
                </Style>
            </DataGrid.Resources>
            <DataGrid.Columns>
                <DataGridTextColumn IsReadOnly="True" 
                                    Binding="{Binding Name}" Header="Name"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

Кодовый код:

using System;
using System.ComponentModel;
using System.Linq;
using System.Windows;

namespace WpfApplication1 {
    public partial class Window1 : Window {
        public Window1() {
            InitializeComponent();
            TheGrid.ItemsSource = Enumerable.Range(1, 100)
                                 .Select(i => new MyClass("Item " + i));
        }
    }

    public class MyClass : INotifyPropertyChanged {
        public string Name { get; private set; }

        private bool m_IsSelected;
        public bool IsSelected {
            get {
                return m_IsSelected;
            }
            set {
                if (m_IsSelected != value) {
                    m_IsSelected = value;
                    Console.WriteLine(Name + ": " + m_IsSelected);
                    PropertyChanged(this, 
                        new PropertyChangedEventArgs("IsSelected"));
                }
            }
        }

        public MyClass(string name) {
            Name = name;
        }

        public event PropertyChangedEventHandler PropertyChanged = 
                                                            delegate { };
    }
}

Заранее спасибо!

РЕДАКТИРОВАТЬ:

  • Попытка применения стиля DataGridRow с использованием свойства RowStyleSelector- ошибка.

  • Попытка применения стиля DataGridRow с использованием событий Row_Loading и Row_Unloading - ошибка.

  • Попытка с использованиемcustom MultiSelectCollectionView - ошибка (не работает с элементом управления DataGrid)

  • Пробная настройка VirtualizingStackPanel.IsVirtualizing="False" - ошибка (необычно медленная с сотнями строк)

  • Попытка связываться с VirtualizingStackPanel.VirtualizationMode (Стандартный или Переработанный) - ошибка.

Как указано в одном из моих комментариев ниже, общая проблема заключается вчто мне нужно привязать свойство SelectedItems DataGrid к моей ViewModel, но не могу, так как SelectedItems только для чтения.

Должна быть какая-то чисткаe-MVVM, готовое решение для этого, но пока оно ускользает от меня!

1 Ответ

1 голос
/ 24 ноября 2010

Я только что попробовал это и вел себя так же. Я смог решить проблему, изменив DataGrid, чтобы он не виртуализировался следующим образом: <DataGrid Name="TheGrid" AutoGenerateColumns="False" VirtualizingStackPanel.IsVirtualizing="False">.

Подробнее см. В этом сообщении MSDN на форуме .

...