2016-08-01 11 views
0

WPFアプリケーションでコードを実行しましたが、ドロップダウンで値を変更したときにユーザーコントロールの内容が表示されません。ユーザーコントロールのコンテンツがレンダリングされない

MainWindow.xaml:

<Window 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:MainViewModel="clr-namespace:Test.ViewModel" 
     xmlns:ViewModel="clr-namespace:Test.ViewModel.AccountTypes" 
     xmlns:View="clr-namespace:Test.View" x:Class="Test.MainWindow" 
     xmlns:Views="clr-namespace:Test.View.AccountTypes" 
     xmlns:v="clr-namespace:Test.View.AccountTypes" 
     xmlns:vm="clr-namespace:Test.ViewModel.AccountTypes" 
     Title="{Binding DisplayName, Mode=OneWay}" ResizeMode="CanResize" WindowStartupLocation="CenterScreen"> 
    <Window.DataContext> 
     <MainViewModel:MainWindowViewModel/> 
    </Window.DataContext> 

    <Grid> 

     <StackPanel Grid.Row="0" HorizontalAlignment="Left" VerticalAlignment="Top" Orientation="Horizontal" Height="28" Width="auto" Margin="5,0,0,0"> 
      <ComboBox Width="360" Margin="1,0" ItemsSource="{Binding AccountTypes}" DisplayMemberPath="Code" SelectedValuePath="ID" SelectedItem="{Binding SelectedAccountType, Mode=TwoWay}" TabIndex="0" /> 
     </StackPanel> 

     <ContentPresenter Content="{Binding CurrentViewModel}"> 
     <ContentPresenter.Resources> 
       <DataTemplate DataType="{x:Type ViewModel:AC1ViewModel}"> 
        <Views:AC1View/> 
      </DataTemplate> 
       <DataTemplate DataType="{x:Type ViewModel:AC2ViewModel}"> 
        <Views:AC2View/> 
      </DataTemplate> 
     </ContentPresenter.Resources> 
    </ContentPresenter> 
     </Grid> 

MainWindowViewModel.cs

public object CurrentViewModel 
     { 
      get { return m_currentViewModel; } 
      set 
      { 
       m_currentViewModel = value; 
       OnPropertyChanged("CurrentViewModel");  
      } 
     }  
      public AccountType SelectedAccountType 
      { 
       get 
       { 
        return m_selectedSearchAccountType; 
       } 
       set 
       { 
        m_selectedSearchAccountType = value; 
         if (SelectedAccountType.Code == "AC1") 
        { 
         m_currentViewModel = new AC1ViewModel(); 
        } 
        else if (SelectedAccountType.Code == "AC2") 
        { 
         m_currentViewModel = new AC2ViewModel(); 
        } 
       } 
      } 

感謝。

+0

あなたは 'CurrentViewModel'プロパティを設定している:あなたのSelectedAccountTypeプロパティでそう

ではなくCurrentViewModelを設定してみてください?さもなければ、 'OnPropertyChanged'は呼び出されません。 – user2697817

+0

あなたがしていることを確実に伝えるのは難しいです。いくつかの間違いがコードを単純化したようです - m_currentViewModelは宣言されていません。 _CurrentViewModelと同じですか?またはCurrentViewModelプロパティ?それとも別のことですか? –

答えて

3

同じくらいあなたが代わりにあなたがm_currentViewModelプライベートメンバを付加価値化、CurrentViewModelプロパティを使用しないということです。だからOnPropertyChanged("CurrentViewModel")は解雇されず、あなたのビューはCurrentViewModelの変更について通知されません。それはセッターのヴィア

public AccountType SelectedAccountType 
{ 
    get 
    { 
     return m_selectedSearchAccountType; 
    } 
    set 
    { 
     m_selectedSearchAccountType = value; 
     if (SelectedAccountType.Code == "AC1") 
     { 
      CurrentViewModel = new AC1ViewModel(); 
     } 
     else if (SelectedAccountType.Code == "AC2") 
     { 
      CurrentViewModel = new AC2ViewModel(); 
     } 
    } 
} 
1

あなたは、何か(あなたがそのコードを残しているため、私は、何を知らない)m_currentViewModelと呼ばれ、あなたがのContentPresenterのContentプロパティにバインドされているパブリックプロパティCurrentViewModelをプライベートオブジェクト_CurrentViewModelを持っています。

m_currentViewModelの値を変更しても、変更した人には何も言わずに何もバインドされていないため、何も起こりません。あなたがする必要がどのような

は、2つのことが起こりますので、CurrentViewModelに新しい現在のviewmodelを割り当てることです:

  • CurrentViewModelの値が変更され、そのセッターは_CurrentViewModelvalueを割り当て、そのゲッター戻りますので、 _CurrentViewModelの値。 CurrentViewModelのセッターが正しくPropertyChangedを上げるため

  • ビューはは、CurrentViewModelの値が変更されたを知っています。これにより、コンテンツプレゼンターはコンテンツを更新する必要があります。私はあなたのコードから言うことができるように

+0

あなたのレスポンスありがとうございます。私は上記の私の質問のコードを更新しました。しかし、私はドロップダウン値でAC2を選択したとしても、常にAC1ユーザーコントロールの内容を見ています。 –

+0

"私はCurrentViewModelに新しい現在のビューモデルを割り当てて"という提案を変更していないので、まだ壊れています。あなたはまだ何かにそれを割り当てています。 @アレックスの答えは、30秒で提出を打つ私を打ち負かす、彼は私が単に記述した実際のコード変更を提供します。 99%が問題を解決すると確信しています。もしそうなら、彼の答えを正しいものとして受け入れるべきです。 –

関連する問題