0

私は WPF を初めて使用しますが、コード ビハインドから動的に追加されたユーザー コントロール インスタンスのコレクションを含むラップ パネルを含むウィンドウを作成しました。各ユーザー コントロールは、最終的に、データベース呼び出しから返された行のデータを表示します。これをMVVMに準拠させたいのですが、アーキテクチャに少しこだわっています。ユーザーコントロールのビューモデルと、ユーザーコントロールのビューモデルの観察可能なコレクションを持つウィンドウのビューモデルが必要だと思います。ラップ パネルがユーザー コントロール ビュー モデルのコレクションを認識し、コレクション内の各インスタンスのユーザー コントロールを確立することを認識できるように、ビュー側のラップ パネルにバインドするにはどうすればよいですか?

これがすべて適切にバインドされたら、定期的にデータベースにクエリを実行し、ユーザー コントロール ビュー モデル オブジェクトを作成/更新するバックグラウンド ワーカーを作成できると思います。INotifyPropertyChanged から継承し、ユーザー コントロール ビュー モデルでプロパティ変更イベントを発生させる場合バインディングに基づいてすべてが更新されます。その音は正しいですか?

リスト ボックスにバインドされた文字列の observablecollection などの基本的な例を見てきましたが、これをより複雑なケースに適用するのに問題があります。一般的なアーキテクチャや、どこから始めるべきかについての提案は大歓迎です!

4

2 に答える 2

9

基本的に、ObservableCollection の要素ごとに 1 つの項目を持つ列挙可能なコントロールが必要です。カスタム コントロールを使用してデータを表示するには、コントロールの項目をテンプレート化する必要があります。

これを行うには、データ オブジェクトを保持する ObservableCollection を作成し、それを ListBox の ItemsSource として使用します。次に、ListBox を変更して、デフォルトのレイアウトではなく、WrapPanel にアイテムを表示する必要があります。ListBox の ItemTemplate を変更して、各リスト項目にカスタム ユーザー コントロールを使用します。

ビューモデル:

public class WindowViewModel
{
     public ObservableCollection<MyDatabaseObject> DatabaseObjects { get; set; }
}


public class MyDatabaseObject : INotifyPropertyChanged
{
     public event PropertyChangedEventHandler PropertyChanged;

     public string DbName 
     { 
         get { return _dbName; }
         set { 
                _dbName = value;
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs("dbName");
         } 
     }

     private _dbName;
}

Xaml:

 <Grid>
    <ListBox ItemsSource="{Binding DatabaseObjects}">
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel/>
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <MyUserControl Title="{Binding DbName}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>
于 2012-04-08T23:12:28.840 に答える
2

ItemsControlクラスをお探しですか?ItemUserControlViewModel (-> アイテム ユーザー コントロール ビュー)にItemsControl.ItemTemplate設定します。DataTemplateそしてでItemsControl.ItemsPanelに設定しItemsPanelTemplateますWrapPanel

ItemControl のプロパティはfromItemsSourceにバインドされます。ObservableCollection<ItemUserControlViewModel>WindowViewModel

于 2012-04-08T21:33:55.913 に答える