用户控件内容无法呈现

时间:2016-08-01 15:24:17

标签: c# wpf mvvm

我在我的WPF应用中关注了代码,但是当我更改下拉列表中的值时,我没有看到任何用户控件内容。请问您建议我缺少什么?

MainWindow.xaml:

array.each_slice(2).count

MainWindowViewModel.cs

<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>

感谢。

2 个答案:

答案 0 :(得分: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 :(得分:1)

你有一个私人对象_CurrentViewModel,有些东西(我不知道是什么,因为你遗漏了那段代码),名为m_currentViewModel,还有一个公共财产CurrentViewModel已绑定到ContentPresenter的Content属性。

当您更改m_currentViewModel的值时,没有任何反应,因为您没有告诉任何人您更改了它,并且无论如何都没有任何约束。

您需要做的是将新的当前视图模型分配给CurrentViewModel,因为这样会发生两件事:

  • CurrentViewModel的值会发生变化,因为它的setter会将value分配给_CurrentViewModel,其getter会返回_CurrentViewModel的值。

    < / LI>
  • 视图将知道 CurrentViewModel的值已更改,因为CurrentViewModel的设置者正确引发了PropertyChanged。这应该使内容演示者更新其内容。