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"}));
而不是选择,它会添加一个新行并立即在网格中显示它。
你可以告诉我我做错了什么吗? 你需要更多细节吗? 谢谢 (希望你理解我的英语)答案 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种方法可以解决这个问题。
答案 2 :(得分:0)
您忘记在ViewModel中实现INotifyPropertyChanged。 请参阅Microsoft的really cool example。
另一个example。
INotifyPropertyChanged提供双向数据绑定,因此您对View的更改将反映在模型层中。