0

オブジェクトにバインドするUserControlwithがあるとします。オブジェクトのコレクションは、実際には Flash ActiveX オブジェクトに送信されます。このため、Foo オブジェクトのプロパティに "WPF バインド" できません。DependencyPropertyObservableCollection<Foo>Foo

Foo オブジェクトのプロパティが UserControl 以外のものによって更新された場合、UserControl に通知してリフレッシュするようにしたい (つまり、すべての Foo オブジェクトを Flash オブジェクトに再送信する)。

これを処理する方法がよくわかりません。それほど明確ではない 2 つの可能性を考えることができます。

  1. UserControl は、オブジェクトを含むオブジェクトのイベントをサブスクライブしObservableCollection<Foo>ます。Foo オブジェクトのプロパティが変更されるたびにイベントが発生するため、UserControl は Foo オブジェクトを Flash オブジェクトに再送信することを認識します。

  2. UserControl をCollectionChangedObservableCOllection オブジェクトのイベントにサブスクライブさせると、何らかの形でObservableCOllection<Foo>オブジェクトがAction NotifyCollectionChangedAction.Reset.

    void OnFooCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (!_flashIsLoaded)
            return;
    
        if (e.Action == NotifyCollectionChangedAction.Reset) {
            ClearAndSendFoos(this, Foos);
            return;
        }
        ....
    

上記の2つのいずれかを実行する方法、またはコレクションを更新する時期をUserControlに知らせる方法はありますか?

4

2 に答える 2

0

複数の ViewModel を持つことを検討する必要があります。

ViewModel にある項目で発生する変更に関心がある場合は、それらの項目の ViewModel を作成し、ViewModel コレクションをObservableCollection<ItemViewModel>.

そうすれば、実際に関心のあるプロパティにバインドできます。

例を見てみましょう:

// the overall viewModel:
public class OverallViewModel : ViewModelBase
{
    public ObservableCollection<ProductViewModel> Products { get; set; };
}

// the item viewmodel:
public class ProductViewModel : ViewModelBase
{
    public string ProductName { get; set; }
    public int CountOfSold { get; set; }
}

バナナを 5 本売ります。バナナの販売数が変わります。アイテムに直接バインドするため、追加のイベントが不要になり、人工的なコレクション イベントをリッスンする必要なくビュー (この場合はユーザー コントロール) を更新できます。

私は Flash についてあまり知りませんが、ユーザー コントロールにフラッシュをホストするコンバーターがあれば役立つかもしれません。少なくとも、すべてのリストをクロールする必要はなく、1 つのアイテムだけをクロールする必要があります。

これがお役に立てば幸いです

于 2012-07-19T16:49:42.360 に答える
0

ここで何かがおかしいようです。投稿に MVVM のタグを付けたので、それを使用していると思います。

モデル、ビュー、ビューモデルを使用すると、ビューモデルとモデルの間でこの作業を行う必要があります。したがって、ViewModel はモデルのイベントをサブスクライブして更新します。モデルにそのようなイベントがない場合は、継承して追加します。次に、ViewModel は INotifyPropertyChanged を実装し、ObservableCollection を使用するため、View は既に更新されています。

ViewModel の ObservableCollection を取得して変更すると、UserControl をイベントにサブスクライブさせる必要がなくなります。

ビューには、ViewModel の更新が表示されるだけです。

于 2012-07-19T16:26:16.317 に答える