5

さまざまな自己定義ビューを表示する WPF ウィンドウがあります。これまでのところ、MVVM について学んだことはすべて使用できました :)

ここで、新しい「問題」に直面しました。同じビューの 10 個のエンティティがより大きなビューに表示されています。これらの 10 個のビュー エンティティには一連のコントロール (テキスト ボックス、コンボ ボックスなど) が含まれていますが、すべて一貫しています。

では、これらのビューをビューモデルにバインドするにはどうすればよいでしょうか?

「上位レベル」の ViewModel に ViewModel の 10 個のインスタンスを配置し、ビューに VM のインスタンスをデータ コンテキストとして修正定義することを考えました。

私の質問は今です->多くの(同一の)ビューをビューモデルにバインドするより簡単な(またはより便利な)方法はありますか?

コード例:

モデルを見る:

private PanelViewModel _panelViewModel1 = new PanelViewModel();
public PanelViewModel PanelVM1
{
   get { return _panelViewModel1; }
}  

ビューの例:

<myControls:vwPanel HorizontalAlignment="Left" x:Name="vwPanel1" 
                    VerticalAlignment="Top" DataContext="{Binding Path=PanelVM1}"/>

私が気になるのは、10 回のビューに対してこのロジックが 10 回必要になるということですか?

更新: いくつかの質問に答えるために: 1 つのビューを 10 回表示したい (私の例では) UserControl から継承して独自のビューを定義しました。だから私のvwPanel継承からUserControl. 10 個の vwPanels は、Grid 内の StackPanel 内に配置されています。

あなたが指摘したように、データを表示することではありません。リストビューまたはデータグリッドが開始するのに適しています。これだけ多くの入力コントロールが必要な特殊なケースです:/

UPDATE2:私が望んでいたのは、ViewModel のリストを定義し、10 個のビューをこのリストの 1 つにバインドするようなものでした。しかし、これは機能しませんか?少なくとも、XAML からリスト内の 1 つの「特別な」エンティティを参照する方法がわかりません...

4

2 に答える 2

8

DataTemplates通常、へのマッピングViewsには暗黙的に使用しViewModelsます。それらは<Application.Resources><Window.Resources>または次のような特定の要素の下にのみ入ることができます<TabControl.Resources>

<DataTemplate DataType="{x:Type local:PanelViewModel}">
    <myControls:vwPanel />
</DataTemplate>

これは、WPF がタイプ の VisualTree でオブジェクトに遭遇するたびにPanelViewModel、それを を使用して描画することを意味します。vwPanel

通常、オブジェクトはプロパティVisualTreeを介して配置されますItemsSource

<ItemsControl ItemsSource="{Binding CollectionOfAllPanels}" />

またはを使用してContentControl

<ContentControl Content="{Binding PanelVM1}" />
于 2012-06-15T14:01:01.473 に答える
1

私があなたの質問を正しく理解できれば、あなたは何を視覚的に表現するかのコレクションを持っています。つまり、単一のビューを定義したい複数のビューモデルがありますが、X 回表示します。あなたの例は、「PanelViewModel」のビューとしてパネルを使用していることを示しています... vwPanelの親アイテムのコントロールは何ですか? ListBox のようなものを使用していると仮定すると、vwPanel を含むカスタム DataTemplate を定義し、その DataTemplate を ListBox.ItemTemplate に割り当てることができます。

例えば:

<Window.Resources>
    <DataTemplate x:Key="myVMTemplate" TargetType="{x:Type myViewModels:PanelViewModel}">
        <myControls:vwPanel HorizontalAlignment="Left" VerticalAlignment="Top"/>
    </DataTemplate>
</Window.Resources>

<ListBox ItemsSource="{Binding Path=MyCollectionOfPanelVMs}" 
         ItemTemplate="{StaticResource myVMTemplate}" />

これが機能することは確認していません。

于 2012-06-15T13:59:47.390 に答える