我有一个带有一个Combobox和一个DataGrid的WPF视图。我使用Entity Framework数据库第一个上下文作为我的应用程序中的日志术语上下文。
让我们说,这个背景应该是Global.DbContext
。
我创建的我的entites是:Log
和Client
。
在我的XAML中,我有这样的绑定:
<DataGrid ItemsSource = {Binding LogEntries} />
<ComboBox ItemsSource="{Binding Clients}" SelectedItem = {Binding SelectedClient} DisplayMemberPath="fullDomainName"
IsSynchronizedWithCurrentItem="True"/>
在我的视图模型中,我有这些属性(我使用Catel Framework,所以属性看起来有点奇怪):
public ObservableCollection<Log> LogEntries
{
get { return GetValue<ObservableCollection<Log>>(LogEntriesProperty); }
set { SetValue(LogEntriesProperty, value); }
}
public static readonly PropertyData LogEntriesProperty = RegisterProperty("LogEntries", typeof(ObservableCollection<Log>), null);
public ObservableCollection<Client> Clients
{
get { return GetValue<ObservableCollection<Client>>(ClientsProperty); }
set { SetValue(ClientsProperty, value); }
}
public static readonly PropertyData ClientsProperty = RegisterProperty("Clients", typeof(ObservableCollection<Client>), null);
public Client SelectedClient
{
get { return GetValue<Client>(SelectedClientProperty); }
set { SetValue(SelectedClientProperty, value); }
}
public static readonly PropertyData SelectedClientProperty = RegisterProperty("SelectedClient", typeof(Client), null);
和构造函数:
public LogWindowViewModel()
{
Global.DbContext.Clients.Load();
Clients = Global.DbContext.Clients.Local;
var qry = Global.DbContext.Logs.Where(c => c.client_id == SelectedClient.client_id);
qry.Load();
LogEntries = new ObservableCollection<Log>(qry);
}
不起作用,因为在构造函数执行时SelectedClient
为空。我希望我的dbset仅包含所选客户端的LogEntries(db中的客户端和日志表都有client_id字段)。我怎样才能实现这一目标?
我不知道我的构造函数代码是完全错误的,但我无法弄清楚在“纯MVVM”方法的上下文中该做什么。如果可以,请帮助我。
答案 0 :(得分:0)
如果我说得对,这就是我的方式:
1)在构造函数中创建ObserableCollections的新实例,以便建立绑定。
2)移动代码以将LogEntry列表填充到SelectedClient的Setter
public Client SelectedClient
{
get { return GetValue<Client>(SelectedClientProperty); }
set {
SetValue(SelectedClientProperty, value);
if(value == null)
{
return;
}
var qry = Global.DbContext.Logs.Where(c => c.client_id == value.client_id);
qry.Load();
LogEntries.Clear();
foreach(var entry in qry)
{
LogEntries.Add(entry);
}
}
}