0

ツリービューを使用してナビゲーション メニューを実装しようとしています。左側のパネルにはツリービューがあり、右側のパネルには一致したビューがあります。MVVM であるため、正しいビューを切り替えるのが困難です。

ここに画像の説明を入力

Menu1 をクリックすると、View1.xaml ビューが表示されます。Menu2 をクリックすると、View2.xaml ビューが表示されます。

私のコードは次のようになります: MainView.xaml

<Window x:Class="Menu.View.MainView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:Views="clr-namespace:Menu.View"
        Title="MainView" Height="300" Width="300">
    <Window.Resources>
        <DataTemplate DataType="{x:Type Views:Page1}">
            <Views:Page1 />
        </DataTemplate>
        <DataTemplate DataType="{x:Type Views:Page2}">
            <Views:Page2 />
        </DataTemplate>
    </Window.Resources>
    <DockPanel>
        <Grid DockPanel.Dock="Left">
            <TreeView>
                <TreeViewItem Header="Menu 1" />
                <TreeViewItem Header="Menu 2" />
                <TreeViewItem Header="Menu 3" />
            </TreeView>
        </Grid>

        <Grid DockPanel.Dock="Right">
                <Views:Page1 />
                <Views:Page2 />
        </Grid>
    </DockPanel>
</Window>

Page1.xaml (「メニュー 1」をクリックしたときに表示されるビュー)

<Grid>
    <Label FontSize="24" FontWeight="Bold">1</Label>
</Grid>

Page2.xaml (「メニュー 2」をクリックしたときに表示されるビュー)

<Grid>
    <Label FontSize="24" FontWeight="Bold">2</Label>
</Grid>

すべてのページに独自のViewModelがあり、MainViewModelと呼ばれるメインのViewModelがあります。MVVMモードでそのようなことをどのように実装すればよいですか?

4

1 に答える 1

0

ここが間違いだと思います。ViewModels を DataType に入れる必要があります。そのため、DataContext を埋めると、DataTemplate が仕事をします。何かのようなもの :

   <DataTemplate DataType="{x:Type ViewModels:Page1ViewModel}">
                <Views:Page1 />
            </DataTemplate>
            <DataTemplate DataType="{x:Type ViewModels:Page2ViewModel}">
                <Views:Page2 />
            </DataTemplate>

それ以外の :

<Views:Page1 />
<Views:Page2 />

ContentControl を追加し、次のようにそのコンテンツへのバインディングを行います。

<ContentControl Content="{Binding MyViewModel}"></ContentControl>

myView は MainViewViewModel のプロパティ ( INotifyPropertyChanged を実装する必要があります) は次のようになります。

        object _MyView;
        public object MyViewModel
        {
            get
            {
                return _MyView;
            }
            set
            {
                _MyView = value;
                OnPropertyChanged("MyViewModel");
            }
        }

ここで、各 TreeViewItem に、ex のコンテンツを更新するコマンドを追加します。

MainViewViewModel に CallView1Command プロパティを追加して実装します(コマンドの処理方法を参照)

そのため、Command の実行メソッドで、表示したいビューに従って MyViewModel を更新できます。

Unityを使用して ViewModel をインスタンス化することをお勧めします。

説明不足ですが、参考になれば幸いです

于 2012-06-27T08:55:25.410 に答える