WPF Binding在短时间内自发失败

时间:2010-11-24 04:13:45

标签: wpf data-binding .net-4.0

如果要编译并运行以下代码,可以发现选择和/或取消选择行会导致将一行写入“输出”窗口(因为仔细检查所述代码会导致人们相信)。

在使用箭头键(分别按住向上和向下箭头几次遍历整个数据集)更改网格的选定行的短暂时间之后,人们会感到震惊(就像我一样)注意到输出消息即使在继续循环通过网格的行时也会停止。

我试图获得与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的样式 财产 - 失败。

  • 尝试使用DataGridRowRow_Loading事件应用Row_Unloading样式 - 失败。

  • 尝试使用自定义MultiSelectCollectionView - 失败(无法使用DataGrid控件)

  • 尝试设置VirtualizingStackPanel.IsVirtualizing="False" - 失败(数百行非常缓慢)

  • 尝试弄乱VirtualizingStackPanel.VirtualizationMode(标准或回收) - 失败。

正如我在下面的一条评论中所述,最重要的问题是我需要将DataGrid的SelectedItems属性绑定到我的ViewModel,但不能,因为SelectedItems是只读的。

有一些纯粹的MVVM,开箱即用的解决方案,但到目前为止,它已经让我失望了!

1 个答案:

答案 0 :(得分:1)

我刚试过这个并且有同样的行为。我能够通过更改DataGrid来解决问题,以防止虚拟化,如下所示:<DataGrid Name="TheGrid" AutoGenerateColumns="False" VirtualizingStackPanel.IsVirtualizing="False">

有关详细信息,请参阅此MSDN forum post