【问题标题】:WPF Datagrid dosnt show the queryresult, even its boundWPF Datagrid 不显示查询结果,甚至其绑定
【发布时间】:2014-07-01 13:07:57
【问题描述】:

我有问题。 我有一个绑定到“Patient_view”的数据网格:

 private ObservableCollection<pViewModel> patient_view;

            public ObservableCollection<pViewModel> Patient_view
            {
                get
                {
                    return patient_view;
                }
                set
                {
                    if (Patient_view != value)
                    {
                        patient_view = value;
                        this.NotifyPropertyChanged("Patient_view");
                    }
                }
            }

如果我启动我的程序,数据网格会显示此查询的查询结果:

 public static IList<Patient_Anschrift_List> Patients { get; private set; }

        static PatientList()
        {
            using (dbentities context = new dbentities())
            {
                Patients = new List<Patient_Anschrift_List>();
                Patients = (from p in ..
                            select new Patient_Anschrift_List()
                            {..}

        }

好的,没关系。但是现在我想使用其他一些查询(它们已经编写好了。我的程序基本上已经可以工作了,但是必须将其放入 mvvm 模式中,这对我来说很难,因为我没有真正的编程经验)。

我的问题是,数据网格不显示其他查询结果。 在启动时它会充满:

 public pViewModelList()
        {
            patient_view = new ObservableCollection<pViewModel>(PatientList.Patients.Select(p => new pViewModel(p)));

            //patients.CollectionChanged += Patients_AddCollection;
        }

但如果我尝试在按钮按下时更改集合,它就不会做任何事情。它一直显示旧的结果。 这就是我在按钮按下时所做的:

 private void ExecuteAddPatientCommand()
        {
            // Patients.Add(new pViewModel(new Patient()));
            Abfragen abfragen = new Abfragen();
            Eingaben_prüfen p = new Eingaben_prüfen();

            List<Patient_Anschrift_List> ausgabe = new List<Patient_Anschrift_List>();

            ausgabe = abfragen.select_Patients(p.Nachname(eingabe1), p.Vorname(eingabe1), p.Versichertenstatus(eingabe1)...);
         //   patient_view.Clear();
            patient_view = new ObservableCollection<pViewModel>(ausgabe.Select(s => new pViewModel(s)));

如果我这样做:

patient_view.Add(new pViewModel(new dModel.Patient_Anschrift_List{Nachname ="test", Vorname = "test"}));

它不是选择,而是添加一个新行并立即在网格中显示它。

你能告诉我我做错了什么吗? 你需要更多细节吗? 谢谢你 (希望你能理解我的英语)

【问题讨论】:

  • 你设置了双向绑定模型了吗?
  • 是的,我就是这样绑定的:
  • ItemsSource="{Binding Patient_view,Mode=TwoWay}"
  • Jup,吃到了。只是复制了错误的东西:D(如果有影响,请拿出来测试一下)
  • 然后显式调用 notifyproperty 更改为 NotifyPropertyChanged("Patient_view");更改 Patient_view 后

标签: c# wpf mvvm datagrid


【解决方案1】:

您正在设置私有属性 patient_view,这不会引发 PropertyChange 通知。

更改您的代码以设置公共属性Patient_view,这会在set 方法中引发PropertyChange 通知,并且是绑定到视图的版本。

Patient_view = new ObservableCollection<pViewModel>(ausgabe.Select(s => new pViewModel(s)));

它使用 .Add 的私有属性起作用的原因是因为您使用的是 ObservableCollection,它会在添加或删除项目时自动通知 UI 进行更新。

但在上面的代码示例中,您正在完全更改值,而不是仅向现有集合添加或删除项目,因此需要更改通知来告诉 UI 它需要更新。

【讨论】:

  • 如果我们明确称为 notifyproperty 已更改,那么它可以工作,或者我们必须设置像 Patient_view 这样的公共属性
  • @DhavalPatel 是的,在更新私有属性后显式调用NotifyPropertyChanged("Patient_view") 也可以,尽管出于多种原因我试图避免这种情况。我不喜欢额外的代码行,不喜欢我或其他开发人员忘记那额外的代码行的机会,也不喜欢它绕过 set 方法中放置的任何其他逻辑的事实属性(一个常见的例子是我会经常在setset 方法中附加/分离CollectionChanged 事件@):)
  • 我如何设置更改通知?抱歉,但正如我所说,我对此很陌生:(
  • @user3793935 NotifyPropertyChanged("Patient_view") 是您的更改通知,它已经在您的set { ... } 属性的set { ... } 中调用。因此,您只需将“patient_view = new ...”更改为“Patient_view = new ...”(注意大写P,这意味着这将设置公共属性并使用它的set { ... } 方法,而不是小的p设置私有字段,没有更改通知)
【解决方案2】:
<DataGrid ItemsSource="{Binding Patient_view, Mode=TwoWay}" />

Mode TwoWay 是垃圾,你的数据网格永远不会将 itemssource 设置回你的 viewmodel,所以你可以简单地删除它。默认为 OneWay。

 patient_view = new ObservableCollection<pViewModel>(PatientList.Patients.Select(p => new pViewModel(p)));

如果您以这种方式设置 Patient_View,wpf 将没有机会获得通知。有 3 种方法可以解决此问题。

  1. 只初始化一次 ObservableCollection 并使用 Clear()、Add()、Remove() 方法来改变它。这是我喜欢的
  2. 将新的 ObservableCollection 设置为您的属性而不是您的字段,因此调用了 NotifyPropertyChanged("Patient_view")
  3. 在为您的字段设置新的 ObservableCollection 后调用 NotifyPropertyChanged("Patient_view")

【讨论】:

    【解决方案3】:

    您忘记在 ViewModel 中实现 INotifyPropertyChanged。 请参阅 Microsoft 的 really cool example

    另一个example

    INotifyPropertyChanged 提供双向数据绑定,因此您对 View 的更改将反映在 Model 层中。

    【讨论】:

    • 谢谢,我会锁 :)
    • @user3793935,如果对您的任务有帮助,请将其标记为答案。
    猜你喜欢
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    • 2014-02-09
    相关资源
    最近更新 更多