2016-08-01 172 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'财产通过它的制定者?否则,不会调用“OnPropertyChanged”。 – user2697817

+0

很难确定你在做什么。它看起来有些错误简化了你的代码 - m_currentViewModel没有被声明。这与_CurrentViewModel相同吗?或者CurrentViewModel属性?或者是别的什么? –

回答

3

虽然我可以从你的代码告诉的是,你永远不会使用CurrentViewModel属性,而不是你稳定物价m_currentViewModel私有成员。因此,OnPropertyChanged("CurrentViewModel")永远不会被触发,您的视图也不会收到有关CurrentViewModel更改的通知。

在SelectedAccountType财产

所以尽量设置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

你有一个私有对象_CurrentViewModel,东西(我不知道是什么,因为你离开了该代码)称为m_currentViewModel,并且你已经绑定到ContentPresenter的内容属性的公共属性CurrentViewModel

当你改变m_currentViewModel的值时,没有任何反应,因为你没有告诉任何人你改变了它,反正没有任何东西被绑定。

你需要做的就是指定新的当前视图模型来CurrentViewModel什么,因为那样的话会发生两两件事:

  • CurrentViewModel值会发生变化,因为它的二传手分配value_CurrentViewModel及其吸气回报值为_CurrentViewModel

  • 视图将知道是的CurrentViewModel值发生了变化,因为CurrentViewModel二传手正确地提出了PropertyChanged。这应该导致内容演示者更新其内容。

+0

感谢您的回复。现在我已经更新了上述问题中的代码。但即使我在下拉列表中选择了AC2,我也总能看到AC1用户控件的内容。请注意。 –

+0

它仍然被破坏,因为您没有进行我建议的更改:“将新的当前视图模型分配给CurrentViewModel”。你仍然把它分配给别的东西。 @亚历克斯的答案击败了我,提交了30秒,他提供了我刚才描述的实际代码更改。我99%肯定会解决这个问题;如果是这样,你应该接受他的答案是正确的。 –