2017-02-24 9 views
0

私のアプリケーションでは、データベースの最初の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セッターに電話してください... お願いします。どうもありがとう。

+0

バインディングも更新する必要があります。 –

答えて

1

さてを、私は私のコードで間違っていたものを考え出しました。

私のdatabindigはSelectedClient.last_statusに設定されました。何らかの理由で期待通りに動作しませんでした。だから私はLastStatusと呼ばれる新しいのviewmodelプロパティを作成し、私のRefreshClientInfoを変更:

private void RefreshClientInfo(Client client) 
    { 
     Global.Database.Entry(client).Reload(); 
     LastStatus = client.last_status; 
     SetValue(SelectedClientProperty, client); 
    } 

と、この新しいプロパティにラベルをバインドさ。今はすべて正常に動作します。

0

EFクエリから返された新しいClientオブジェクトにSelectedClientプロパティを設定する必要があります。

データベースを照会する前に現在選択されているクライアントのclient_idを保存してから、この特定のclient_idの新しいClientオブジェクトを選択すると、これを実行できます。

これを試してみてください:

private void RefreshClients() 
{ 
    int? currentlySelectedClientId = (SelectedClient != null) ? SelectedClient.client_id : default(int?); 
    var qry = (from c in Global.Database.Clients where c.client_id != 1 select c).ToList(); 
    Clients = new ObservableCollection<Client>(qry); 
    if (currentlySelectedClientId.HasValue) 
     SelectedClient = Clients.FirstOrDefault(x => x.client_id = currentlySelectedClientId.Value); 
} 

編集を:はあなたがDBから更新されたレコードをフェッチしていることを確認してください:

private void RefreshClientInfo(Client client) 
{ 
    var newClient = (from c in Global.Database.Clients where c.client_id == client.client_id select c).ToList(); 
    SetValue(SelectedClientProperty, newClient[0]); 
} 
+0

申し訳ありませんが、私はそれが私を助けるかもしれない - 私はすべてのクライアントをリフレッシュしたくない、私は1つだけをリフレッシュしたいと思うことがわかりません。私が一般的に求めているのは、 'RefreshClientInfo(クライアントクライアント)'です。 'RefreshClients()'ではありません。しかし、多分私は何かを理解していない。 –

+0

更新後、データベースからクライアントを再フェッチする必要があります。私の編集を参照してください。 – mm8

+0

ボタンを押したときにまだリフレッシュしません:(リストボックスで選択したクライアントを変更して戻ったときにリフレッシュされます) –

関連する問題