如果要编译并运行以下代码,可以发现选择和/或取消选择行会导致将一行写入“输出”窗口(因为仔细检查所述代码会导致人们相信)。
在使用箭头键(分别按住向上和向下箭头几次遍历整个数据集)更改网格的选定行的短暂时间之后,人们会感到震惊(就像我一样)注意到输出消息即使在继续循环通过网格的行时也会停止。
我试图获得与this answer中给出的类似的东西。
我绝对感到困惑。什么会导致我的网格上的绑定自发失败?这里的任何和所有帮助将非常感谢!!此外,如果有人有时间重现这一点,请评论你的发现。
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
样式 - 失败。
尝试使用自定义MultiSelectCollectionView - 失败(无法使用DataGrid控件)
尝试设置VirtualizingStackPanel.IsVirtualizing="False"
- 失败(数百行非常缓慢)
尝试弄乱VirtualizingStackPanel.VirtualizationMode
(标准或回收) - 失败。
正如我在下面的一条评论中所述,最重要的问题是我需要将DataGrid的SelectedItems属性绑定到我的ViewModel,但不能,因为SelectedItems是只读的。
有一些纯粹的MVVM,开箱即用的解决方案,但到目前为止,它已经让我失望了!
答案 0 :(得分:1)
我刚试过这个并且有同样的行为。我能够通过更改DataGrid来解决问题,以防止虚拟化,如下所示:<DataGrid Name="TheGrid" AutoGenerateColumns="False" VirtualizingStackPanel.IsVirtualizing="False">
。
有关详细信息,请参阅此MSDN forum post。