1

私はWPFやC#に慣れていませんが、MVVMとViewModelの状況には慣れていません。

私は達成する必要があることについてMVVMとバインディングの基本を経験してきましたが、それでもxamlの詳細につまずきました。

私の最終目標は、2つのUserControl.xamlビューのいずれかが入力される1つの空白のMainWindow.xamlビューを作成することです。

MainView.xamlとOptionalView.xamlの2つの単純なUserControlビューがあります。

<UserControl x:Class="TestViewSwap.MainView"
         ...>
<Grid>
    <TextBlock Text="Main View" />
</Grid>

<UserControl x:Class="TestViewSwap.OptionalView"
         ...>
<Grid>
    <TextBlock Text="Optional View" />
</Grid>

そしてMainWindow.xaml

<Window x:Class="TestViewSwap.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">

    <ContentControl Content="{Binding CurrentView}" />
</Window>

CurrentViewは、選択した内容に応じて、コードビハインドでOptionalViewまたはMainViewのいずれかに設定する必要があることは知っていますが、まだわからないのは... CurrentViewのタイプ、またはファイルのコードビハインドです。 ?

4

1 に答える 1

1

CurrentViewは、MainWindowViewModelまたはWindow.xamlのDatacontextであるクラスのプロパティである必要があります。ビューごとに、データテンプレートを定義します。データテンプレートには、ユーザーコントロールへのビューまたはポイントを含めることができます。CurrentViewをビューモデルに割り当てて、ビューを切り替えます。ここにいくつかのコードがあります:

MainWindowViewModel

public class MainWindowViewModel : ViewModel
{
  object currentView;

  public MainWindowViewModel()
  {
    CurrentView = new OptionalView();
    SwitchViewCommand = new RelayCommand(SwitchView);
  }

  public object CurrentView
  {
    get { return this.currentView; }
    set 
    { 
      this.currentView = value;
      NotifyPropertyChanged("CurrentView");
    }
  }

  public RelayCommand SwitchViewCommand { get; set; }

  void SwitchView()
  {
    if (CurrentView is OptionalView)
      CurrentView = new SettingsView();
    else
      CurrentView = new OptionalView();
  }
}

public class OptionalView { }

public partial class SettingsView { }

MainWindow

<Window x:Class="WpfLab.Views.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:views="clr-namespace:WpfLab.Views"
    xmlns:vm="clr-namespace:WpfLab.ViewModels"
    Title="MainWindow"
    Width="525"
    Height="350">
<Window.Resources>
    <DataTemplate DataType="{x:Type vm:OptionalView}">
        <Border Background="Red" />
    </DataTemplate>

    <DataTemplate DataType="{x:Type vm:SettingsView}">
        <views:SettingsView />
    </DataTemplate>
</Window.Resources>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <ContentControl Content="{Binding CurrentView}" />
    <Button Grid.Row="1"
            Command="{Binding SwitchViewCommand}"
            Content="SwitchView" />
</Grid>

設定ビュー

<UserControl x:Class="WpfLab.Views.SettingsView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         d:DesignHeight="300"
         d:DesignWidth="300"
         mc:Ignorable="d">
<Border Background="Green" />

于 2012-09-24T20:44:37.093 に答える