7

ボタンクリックのUserControlsを変更したい(ここでは複雑にしないので、重要な部分についてのみ説明します)。したがって、これらのUserControlのViewModelをContentControlにバインドし、DataTemplatesを使用してそれらをViewに関連付けるというアイデアがありました。コードは次のとおりです。

<Window x:Class="Project.MainWindow">
<Window.Resources>
    <DataTemplate DataType="{x:Type UserControl:ViewUserControlViewModel}" >
        <UserControl:ViewUserControl/>
    </DataTemplate>
    <DataTemplate DataType="{x:Type UserControl:EditUserControlViewModel}" >
        <UserControl:EditUserControl/>
    </DataTemplate>
</Window.Resources>
<Grid>
    <ContentControl DataContext="{Binding UserControlViewModel}" />
    <Button Content="View" Click="ChangeToView()"/>
    <Button Content="Edit" Click="ChangeToEdit()"/>
</Grid>
</Window>

ViewModel:

public class MainWindowViewModel : DependencyObject
{
    public DependencyObject UserControlViewModel
    {
        get { return (DependencyObject)GetValue(UserControlViewModelProperty); }
        set { SetValue(UserControlViewModelProperty, value); }
    }
    public static readonly DependencyProperty UserControlViewModelProperty = 
           DependencyProperty.Register("UserControlViewModel", typeof(DependencyObject), typeof(MainWindowViewModel), new PropertyMetadata());

    public MainWindowViewModel()
    {
        UserControlViewModel = new EditUserControlViewModel();
    }
}

しかし、問題があります。プロジェクトを開始すると、ボタンのみが表示され、UserControlは表示されません。私は何を間違えましたか?

4

3 に答える 3

18

あなたWindow.DataContextがこれに適切に設定されてMainWindowViewModelいる場合は、仕事をする必要があります

<ContentControl Content="{Binding UserControlViewModel}" />
于 2012-07-19T23:59:30.790 に答える
4

mvvmを実行する場合、ビューモデルはINotifyPropertyChangedを実装し、DependencyObjectから継承しないようにする必要があります。

public class MainWindowViewModel : INotifyPropertyChanged
{
   private object _currentWorkspace; //instead of object type you can use a base class or interface
   public object CurrentWorkspace
   {
      get { return this._currentWorkspace; }
      set { this._currentWorkspace = value; OnPropertyChanged("CurrentWorkspace"); }
   }


   public MainWindowViewModel()
   {
      CurrentWorkspace= new EditUserControlViewModel();
   }

   //todo: to switch the workspace, create DelegeCommand/RelayCommand and set the CurrentWorkspace
   //if you don't know about these commands let me know and i post it

   public ICommand SwitchToViewCommand {get{...}}
   public ICommand SwitchToEditCommand {get{...}}
}

xaml:ContentプロパティをCurrentWorkspaceに設定する必要があります。

<ContentPresenter Content="{Binding UserControlViewModel}" />
<Button Content="View" Comamnd="{Binding SwitchToViewCommand}"/>
<Button Content="Edit" Comamnd="{Binding SwitchToEditCommand}"/>

!ウィンドウのDataContextをMainWindowViewModelインスタンスに設定することを忘れないでください。

于 2012-07-20T05:58:36.003 に答える
1

まず最初に、UserControlのコードを投稿する必要があります。これは(上記のコードスニペットでは)一部のデータを表示する役割を果たしているためです。

次に、コードに何もバインドしていません。

第三に、ViewModelの実装が間違っています。DependencyObjectをサブクラス化する必要はありませんが、代わりにINotifyPropertyChangedインターフェイスを実装して、ビューに通知できるViewModelを確立します。

第四にあなたが何をしているのか分かりません

<ContentControl DataContext="{Binding UserControlViewModel}" />

多分あなたはさらに説明することができますか?

5番目に、MVVM patterm(現在行っていないこと)を実装するときは、クリックイベントなどのイベントの使用を避け、代わりにコマンドを使用する必要があります。

(それはまだ本当の答えではないことは知っていますが、コメント構文で書きたくありませんでした)

于 2012-07-19T23:38:42.633 に答える