私は1つのコンボボックスと1つのDataGridでWPFビューを持っています。 Entity Frameworkデータベースの最初のコンテキストをアプリケーションのログ用語コンテキストとして使用します。 このコンテキストがGlobal.DbContext
であるとします。 EFによって作成された私のエンタイトはLog
とClient
です。私の見解モデルで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」アプローチのコンテキストで何をすべきか分かりません。あなたができるなら私を助けてください。
まだ取得ヌル参照例外にログ・エントリのリストを埋めるためにコードを移動します。(それは道であなたの答えをdownvoted私は=はなかったです)) –
setterでnull例外が発生した場合は、if(value!= null)を追加するだけです。項目が選択されていないため、WPFはSelectedItemをnullに設定する可能性があります。 – unkreativ
申し訳ありませんが、私の誤解は、私のサンプルコードはSelectedClientの設定者でなければなりません。私はテキストでこれを書いたが、サンプルコードはクライアントのセッターにあった。ちょうどそれを修正しました... – unkreativ