WPF Datagrid不显示查询结果,甚至不显示其绑定

时间:2014-07-01 13:07:58

标签: c# wpf mvvm datagrid

我有一个问题。 我有一个数据网格,它与#34; 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");
                    }
                }
            }

如果我启动我的程序,datagrid会显示来自此查询的queryresult:

 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模式中,这对我来说很难,因为我在编程方面没有经验)。

我的问题是,datagrid dosnt显示其他查询结果。 在启动时它充满了:

 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"}));

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

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

3 个答案:

答案 0 :(得分:2)

您正在设置私有财产patient_view,但不会引发PropertyChange通知。

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

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

使用私有属性.Add的原因是因为您使用了ObservableCollection,它会在添加或删除项目时自动通知用户界面更新。

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

答案 1 :(得分:1)

<DataGrid ItemsSource="{Binding Patient_view, Mode=TwoWay}" />

模式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”)

答案 2 :(得分:0)

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

另一个example

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