Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF绑定在短时间使用后会自动失败_Wpf_Data Binding_.net 4.0 - Fatal编程技术网

WPF绑定在短时间使用后会自动失败

WPF绑定在短时间使用后会自动失败,wpf,data-binding,.net-4.0,Wpf,Data Binding,.net 4.0,如果要编译并运行以下代码,就会发现选择和/或取消选择一行会导致将一行写入输出窗口(仔细检查所述代码会让人相信这一点) 在使用箭头键(分别按住向上和向下箭头以遍历整个数据集几次)短时间更改网格的选定行之后,人们会震惊地(就像我一样)注意到输出消息停止,即使在继续遍历网格的行时也是如此 我正试图实现类似于中给出的东西 我完全困惑不解。什么会导致网格上的绑定自动失败?如果您能在这里提供任何帮助,我们将不胜感激!!此外,如果有人有时间复制这一点,请评论你的发现 XAML: <Window x:Cl

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

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

我正试图实现类似于中给出的东西

我完全困惑不解。什么会导致网格上的绑定自动失败?如果您能在这里提供任何帮助,我们将不胜感激!!此外,如果有人有时间复制这一点,请评论你的发现

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设置样式 属性-失败

  • 尝试使用
    Row\u加载
    Row\u卸载
    事件-失败来应用
    DataGridRow
    样式

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

  • 尝试设置
    虚拟化StackPanel.isvirtualization=“False”
    -失败(速度非常慢,有数百行)

  • 尝试混用
    虚拟化StackPanel。虚拟化模式
    (标准或回收)-失败

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


必须有某种纯粹的MVVM,开箱即用的解决方案,但到目前为止,我还是找不到

我刚试过这个,也有同样的行为。我可以通过更改DataGrid来解决这个问题,以防止其虚拟化,如下所示:


有关更多信息,请参见此。

太棒了!我想知道在虚拟化关闭的情况下,我的网格将如何处理大型数据集。。。不管怎么说,这都奏效了!谢谢只是在一个大数据集上尝试了一下,过滤需要花费很多时间!你知道如何在打开虚拟化的情况下避免这种行为吗?你可以尝试重新打开虚拟化-有两种模式可以让另一种模式工作:VirtualizengStackPanel.VirtualizationMode=标准和RecyclingVirtualization行为有时真的很奇怪-确保你的数据网格不在scrollviewer中。我没有页面上的任何显式滚动查看器。(很明显,网格的内容会自动滚动到许多项目中)。我能够崩溃,而双击有时会使其返回,很明显,排序行也是如此。可能与虚拟化有关。最主要的问题是,我无法使用DataGrid控件以MVVM为中心进行多项选择(SelectedItems是只读的,因此不可绑定)。这家伙的解决方案似乎正是我所需要的:尽管我还没有实现它。一旦我有了工作(或不工作…),我会回复。我在之前的评论中链接的解决方案根本不适用于WPF DataGrid控件,所以。。。没有骰子。这个问题有解决办法吗?被接受的答案对我不起作用,如果我在一个新系统中克隆代码,它可以进行一些尝试