2017-02-15 6 views
0

私は1つのコンボボックスと1つのDataGridでWPFビューを持っています。 Entity Frameworkデータベースの最初のコンテキストをアプリケーションのログ用語コンテキストとして使用します。 このコンテキストがGlobal.DbContextであるとします。 EFによって作成された私のエンタイトはLogClientです。私の見解モデルでWPF MVVMコンテキストクエリを変更するcomboBoxにプロパティをバインドするにはどうすればよいですか?

<DataGrid ItemsSource = {Binding LogEntries} /> 
<ComboBox ItemsSource="{Binding Clients}" SelectedItem = {Binding SelectedClient} DisplayMemberPath="fullDomainName" 
      IsSynchronizedWithCurrentItem="True"/> 

私は(プロパティは奇妙なビットに見えるので、私は、Catelフレームワークを使用)これらのプロパティを持っている:私のXAMLで iは、このようなbindigsを持って

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

とコンストラクタを:

コンストラクタの実行時に SelectedClientが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); 
    } 

。選択したクライアント(dbのクライアントテーブルとログテーブルの両方にclient_idフィールドがある)だけでLogEntriesを格納するようにします。どうすればそれを達成できますか? 私のコンストラクタコードは完全に間違っていますが、私は「純粋なMVVM」アプローチのコンテキストで何をすべきか分かりません。あなたができるなら私を助けてください。

答えて

0

私はあなたを取得した場合は、右これは私がそれを行うような方法である:

1)バインディングが確立されるように、コンストラクタでObserableCollectionsの新しいインスタンスを作成します。

2)SelectedClientがnullであるため、SelectedClientのセッター

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); 
      } 
     } 
} 
+0

まだ取得ヌル参照例外にログ・エントリのリストを埋めるためにコードを移動します。(それは道であなたの答えをdownvoted私は=はなかったです)) –

+0

setterでnull例外が発生した場合は、if(value!= null)を追加するだけです。項目が選択されていないため、WPFはSelectedItemをnullに設定する可能性があります。 – unkreativ

+0

申し訳ありませんが、私の誤解は、私のサンプルコードはSelectedClientの設定者でなければなりません。私はテキストでこれを書いたが、サンプルコードはクライアントのセッターにあった。ちょうどそれを修正しました... – unkreativ

関連する問題