2012-03-11 7 views
0

私はICommandsを使用してコンテンツコントロールのコンテンツを切り替えようとしています。このプロパティを設定すると、コンストラクタでは動作しますが、コマンドでは動作しません。コンストラクタでのみ動作するDataTemplateからのContentControlのバインド?

私はこれが(私が変更したいコンテンツコントロールが含まれている図である)ShellView.xamlからの抜粋である

<Application.Resources> 
    <vm:ViewModelLocator x:Key="Locator" 
         d:IsDataSource="True" /> 
    <DataTemplate DataType="{x:Type vm:HomeViewModel}"> 
     <views:HomeView /> 
    </DataTemplate> 
    <DataTemplate DataType="{x:Type vm:DeviceViewModel}"> 
     <views:DeviceView /> 
    </DataTemplate> 
</Application.Resources> 

私app.xamlでこれを持っている:

<ContentControl Content="{Binding Path=CurrentViewModel}" /> 

ボタンバインディングを示す別のスニペット:

<Button Content="Button" 
       Height="23" 
       Name="button2" 
       Width="75" 
       Command="{Binding Path=DeviceViewCommand}" /> 

ここは、ShellViewのコンストラクタですモデル。 CurrentViewModelの設定はここではうまくいきました。 (デバイスを設定した後、テストとしてホームに設定していることがわかります)

public ShellViewModel() 
    { 
     CurrentViewModel = ShellViewModel._deviceViewModel; 
     CurrentViewModel = ShellViewModel._homeViewModel; 
     HomeViewCommand = new RelayCommand(() => ExecuteHomeViewCommand()); 
     DeviceViewCommand = new RelayCommand(() => ExecuteDeviceViewCommand()); 
     LogOut = new RelayCommand(() => LogOutExecute(),() => true); 

    } 

    private void ExecuteDeviceViewCommand() 
    { 
     CurrentViewModel = ShellViewModel._deviceViewModel; 

    } 

ここで何か問題がありますか?

これは、現在のビューモデルでも変更されたプロパティです。これを以前に追加したはずです。私が正しくあなたのprobledを理解している場合

public ViewModelBase CurrentViewModel 
    { 
     get 
     { 
      return _currentViewModel; 
     } 
     set 
     { 
      if (_currentViewModel == value) 
       return; 
      _currentViewModel = value; 
      RaisePropertyChanged("CurrentViewModel"); 
     } 
    } 
+0

MVVMを使用しているようですが、私は間違っているかもしれませんが、私はまだそれに気づいていないと言いたかったのです。しかし、私は、CurrentViewModelが依存型プロパティか、またはPropertyChangedをトリガーするかどうか不思議ですか? – Silvermind

+0

私はええ、私はそれをタグ付けしただろうが、それは特定のMVVMの問題ではないようです。上記のPropertyChangedコードを追加しました。 – benjgorman

+0

ここのコードはすべて正しく見えます。 ExecuteDeviceViewCommandにブレークポイントを設定して、button2クリックで呼び出されていることを確認しましたか? –

答えて

0

私はMVVMパターンを破ることでこれを解決しなければなりませんでした。私は単純にコンテンツコントロールを新しいビューに設定してから、ShellViewModelの現在のビューモデルにデータコンテキストを設定するために、シェルビューモデルのコードの後ろにMVVMライトメッセンジャークラスを使用しました。

私はこのソリューションに満足していませんが、正しく機能します。

1

は、あなたは、CurrentViewModel用VMのクラスを作成INotifyPropertyChangedのからそれを継承し、それ `sプロパティを変更することができます。 Bindng一方向でなければならない。

+0

これは私がやったことです。しかし、プロパティは変更されていないようです。 – benjgorman

+0

あなたがPropertyChangedイベントを発生しようとしたときにnullですか? – dvvrd

+0

値が何に設定されても、値は変更されません。ビューはこれを反映するために単純に変化しません。私はコンテンツコントロールのバインディングに問題があると仮定します。 – benjgorman

1

私は一歩踏み出してContentControlに名前を付け、Content Propertyを直接設定して、何か間違っているかどうかを調べます。さらに、DataContextはContentControlにどのように設定されていますか?セッターにブレークポイントを設定してみてください。出力ウィンドウでバインディングのエラーをチェックすることもできます。

関連する問題