2009-07-19 14 views
2

ListBoxを含む単一のウィンドウを持つVisual Studio 2008 WPFアプリケーション。このアプリケーションには、ListBoxをデータベーステーブルの内容にバインドする、以下に概説するメソッドが含まれています。WCFサービス呼び出しに応答してWPF ListBoxをバインドするデータ

このアプリケーションは、WCFサービスをホストしているWFCサービスコントラクトを実装することもあります。

以下のデータバインディングメソッドは、ウィンドウ上のボタンの押下と、アプリケーションによってホストされるWCFサービスに対してメソッドがリモートで呼び出されたことに応答して呼び出されます。

ボタンを押すと呼び出されると、バインディングが正しく機能し、リストボックスにはデータベーステーブルの内容が反映されます。いくつかのレコードを基になるテーブルに挿入してボタンを押すと、リストボックスの内容が更新され、新しいレコードが反映されます。ただし、WCFサービスを介してリモートでトリガされた場合、データベースへの変更はリストボックスに反映されません。コードをステップ実行すると、データセットにはテーブルの正しいビューが含まれますが、リストボックスはテーブルの前のビューを保持し、データセットの内容を反映しません。

私はこれがスレッドの問題のように思えたので、Dispatcherオブジェクトを利用しようとしましたが、役に立たなかったのです。私の調査から、どちらの呼び出しもUIスレッドで受信されます。

任意の提案を高く評価 - それは私の運を知って、おそらく疑いの余地明らかに何か...

private void BindData() 
    { 
     SqlConnection connection; 

     using (connection = new SqlConnection(CONNECTION_STRING)) 
     { 
      DataSet dtSet = new DataSet(); 
      SqlCommand command = new SqlCommand("SELECT * FROM TheTableWithMyStuffIn", connection); 
      SqlDataAdapter adapter = new SqlDataAdapter(); 
      connection.Open(); 
      adapter.SelectCommand = command; 
      adapter.Fill(dtSet, "TheTableWithMyStuffIn"); 
      listBox1.DataContext = dtSet; 
     } 
    } 

UPDATE:私はむしろWCFよりもリモーティングを使用するために再実装されたリモート通知メカニズム、およびデータバインディングが機能するようになりましたリモートでもローカルでも呼び出されます。 WCFの使用には文脈上の意味がありますか?

答えて

0

私は何年も.NETと何の関係もなかったので、おそらく完全にオフビームですが、他の誰もこれまでの回答を提供していないので、ここに行きます。

.NET Frameworkでデータバインディングがどのように実装されているかに関するMSDNのドキュメントを簡単にスキャンすると、バインドされたデータソースのプロパティが変更されたときに発生するイベントにコントロールの更新内容が依存するという印象を受けます。あなたが提示したコードでは、Fillメソッドでデータを取得した後に、ListBoxDataContextプロパティに新しいDataSetが割り当てられていることがわかりました。

データがすでに取得されているため、ListBoxに更新されたデータを実現させる原因となるイベントがありますか。 DataContextプロパティの設定が更新されるのに十分であると仮定します。しかし、フレームワークの背景の下でひどく多くの配管工事があるようで、ListBoxが別の状況で修正されたときに正常に更新されるとすれば、私は漏れた抽象化を疑うようになります。つまり、基本的な配管が(必ずしも間違っているとは限りませんが)異なるため、別の方法で使用すると片方向で使用すると失敗します。

DataContextプロパティに入力する前に、DataSetを入力すると違いが生じる場合があります。または、これは表面的に合理的な推測ですが、.NETの内部知識がほとんど完全に不足していることを裏切るためにのみ役立ちます。

いずれかの方法、私はDataSetが自動的に更新するWPFリストボックスを起こすための適切なインタフェースを実装するかどうかわからないんだけど

+0

感謝を試してみたいことがあります。私はあなたが提案したように注文をシャッフルしようとしましたが、DataSetをリサイクルするさまざまな方法を試みましたが、まだ運がありません。 –

0

:-)幸運が、それを行うと仮定すると、これを試してみてくださいではなく、作成新しいDataSetとそれをリストボックスに割り当てる場合は、同じインスタンスをデータベースから再入力してみてください。私がこれを書いていたのであれば、おそらくDataSetではなくObservableCollection<T>フィールドを使用していましたが、それはデータをDTOまたはエンティティに移動する必要があることを意味します。

+0

乾杯。私はすでにデータセットをリサイクルしないようにしました。この奇妙なことは、ボタンの押下に完全に対応していることです.WCFメソッドのコンテキストで呼び出されたときにのみ機能します。 データはある時点でエンティティモデルに移動されます。上記のコードは、問題を説明するための単純化に過ぎません。とにかくそれが問題を解決することを望んでいることを追求する価値があるかもしれませんが、私の内側のオタクはなぜこれが機能していないのかを知る必要があります。 –

2

.NET 3/.NET 3.5/Windows SDKに付属のService Trace Viewerをチェックしましたか?

跳ね返っているメッセージをチェックする価値があります。何かがそこに現れているかどうか確認してください。

幸運。

EDITは:

あなたは無音データバインディングエラーを検出する上this記事...応答ニックため

+0

乾杯Kieron - サイレントデータバインディングエラーに関するこの記事は、私の問題の文脈では非常に興味深いようです。私は現在リモートで作業している解決策を持っていますが、IPCの仕組みとしてWCFがなぜ機能しないのかを知るために、今後数日間にわたって再検討します。 –

+0

np、私たちに連絡してください。問題が何かを見て興味深い。 – Kieron

+0

興味のあることから、どのタイプのチャンネルを使用していますか? – Kieron

関連する問題