用户控件内容未呈现
本文关键字:控件 用户 | 更新日期: 2023-09-27 17:59:26
我在WPF应用程序中有以下代码,但当我更改下拉列表中的值时,没有看到任何用户控件内容。你能告诉我我缺了什么吗?
主窗口.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>
主窗口视图Model.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();
}
}
}
谢谢。
我从您的代码中可以看出,您从不使用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();
}
}
}
您有一个私有对象_CurrentViewModel
,一个名为m_currentViewModel
的东西(我不知道是什么,因为您遗漏了那个代码),以及一个绑定到ContentPresenter的Content属性的公共属性CurrentViewModel
。
当您更改m_currentViewModel
的值时,不会发生任何事情,因为您没有告诉任何人您更改了它,也没有任何东西与它绑定。
您需要做的是将新的当前视图模型分配给CurrentViewModel
,因为这样会发生两件事:
-
CurrentViewModel
的值将发生变化,因为它的setter将value
分配给_CurrentViewModel
,而它的getter返回_CurrentViewModel
的值。 -
View将知道
CurrentViewModel
的值已更改,因为CurrentViewModel
的setter正确地提升了PropertyChanged
。这将导致内容演示者更新其内容。