WPF MVVM如何将属性绑定到更改上下文查询的comboBox?

时间:2017-02-15 10:48:00

标签: c# wpf entity-framework mvvm

我有一个带有一个Combobox和一个DataGrid的WPF视图。我使用Entity Framework数据库第一个上下文作为我的应用程序中的日志术语上下文。 让我们说,这个背景应该是Global.DbContext。 我创建的我的entites是:LogClient。 在我的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”方法的上下文中该做什么。如果可以,请帮助我。

1 个答案:

答案 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);
            }
        }
}