私のアプリケーションでは、データベースの最初のEF dbContext(私のアプリケーションではGlobal.Database
)を持つ単純なMVVM WPFアプリケーションがあります。 ItemsSource
というリストボックスのウィンドウは、Clients
と呼ばれるviewmodelプロパティにバインドされています。これは、ObservableCollection
のmy dbmodel Client
です。WPF Entity Frameworkが1つのコンテキストエンティティをリフレッシュする
このリストボックスのSelectedItem
は、SelectedClient
というビューモデルプロパティにバインドされています。
Client
エンティティクラスには、last_status
というフィールドがあり、これは私のデータベースの単純なintです。私はリストボックスからクライアントを選択したとき
だから、私の見解では、ラベルがlast_status
の値を表示する必要がありますSelectedClientのlast_status
にバインドさ。
ボタンとリフレッシュコマンドを私のビューモデルに追加しました。私が欲しいのは、私が手動でデータベースのクライアントのlast_status
を変更して私のビューの更新ボタンを押すと、ラベルの内容が変わるはずです。しかし、私はこれを達成する方法は全く考えていません。ここに私のviewmodelコードの一部は、(私はCatelを使用しますが、それはこの場合のために重要ではありません)です:
public ClientManagerWindowViewModel()
{
RefreshClientInfoCommand = new Command(OnRefreshClientInfoCommandExecute);
Clients = new ObservableCollection<Client>();
RefreshClients();
}
public ObservableCollection<Client> Clients
{
get { return GetValue<ObservableCollection<Client>>(ClientsProperty); }
set { SetValue(ClientsProperty, value); }
}
public static readonly PropertyData ClientsProperty = RegisterProperty("Clients", typeof(ObservableCollection<Client>));
public Client SelectedClient
{
get
{return GetValue<Client>(SelectedClientProperty);}
set
{
SetValue(SelectedClientProperty, value);
}
}
public static readonly PropertyData SelectedClientProperty = RegisterProperty("SelectedClient", typeof(Client));
//here is my refresh button command handler:
public Command RefreshClientInfoCommand { get; private set; }
private void OnRefreshClientInfoCommandExecute()
{
RefreshClientInfo(SelectedClient);
}
//and here is my "logic" for working with dbcontext:
private void RefreshClients()
{
var qry = (from c in Global.Database.Clients where c.client_id != 1 select c).ToList();
Clients = new ObservableCollection<Client>(qry);
}
private void RefreshClientInfo(Client client)
{
Global.Database.Entry(client).Reload();
}
リストボックスのための私のXAML:
<ListBox
x:Name="ClientsListBox"
Grid.Row="1"
Margin="5"
DisplayMemberPath="fullDomainName"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding Clients}"
SelectedItem="{Binding SelectedClient}" />
ラベルのための私のXAML:
<Label Margin="5" Content="{Binding SelectedClient.last_status}" />
、ボタン用:
<Button Command="{Binding RefreshClientInfoCommand}" Content="↻"/>
今のところ、クライアントのlast_status
の値をデータベースで手動で変更し、更新ボタンを押しても何も起こりません。しかし、私はリストボックスで別のクライアントを選択し、必要なクライアントラベルのコンテンツのアップデートに正しく戻ってきます。私が知っている、多分私は非常にばかげた単純な何かを逃すが、私は何を正確に把握できない。多分私はボタンのコマンドハンドラでSelectedClient
を強制的に変更する必要がありますか、何とかSelectedClient
セッターに電話してください... お願いします。どうもありがとう。
バインディングも更新する必要があります。 –