Если бы кто-то скомпилировал и выполнил следующий код, то обнаружил бы, что выбор и / или отмена выбора строки приводит к записи строки в окно вывода (поскольку более тщательный анализ указанного кода заставит поверить в это).
После короткого времени изменения выбранной строки сетки с помощью клавиш со стрелками (удерживая стрелки вверх и вниз соответственно, чтобы перебрать весь набор данных несколько раз), один из них будет шокирован (как я)заметить, что выходные сообщения прекращаются, даже если они продолжают циклически проходить по строкам сетки.
Я пытаюсь достичь чего-то похожего на то, что было дано в этом ответе .
Я абсолютно сбит с толку.Что может привести к самопроизвольному отказу привязок в моей сетке?Любая помощь здесь будет НАМНОГО оценена !!Кроме того, если у кого-то есть время воспроизвести это, пожалуйста, прокомментируйте свои выводы.
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, готовое решение для этого, но пока оно ускользает от меня!