在WPF的窗口中,如何在运行时将一个用户控件切换到另一个用户控件?
我有一个窗口的一部分,它应该显示几个用户控件中的一个。每个UserControl都以不同的格式、排列和样式显示相同的数据。窗口的此部分中显示的特定用户控件应由存储在窗口的ViewModel中的单个设置确定 如何使程序最终用户能够在运行时更改窗口中显示的UserControl?一种(快速但不一定是最好的)方法是向窗口添加ContentControl在WPF的窗口中,如何在运行时将一个用户控件切换到另一个用户控件?,wpf,binding,user-controls,window,viewmodel,Wpf,Binding,User Controls,Window,Viewmodel,我有一个窗口的一部分,它应该显示几个用户控件中的一个。每个UserControl都以不同的格式、排列和样式显示相同的数据。窗口的此部分中显示的特定用户控件应由存储在窗口的ViewModel中的单个设置确定 如何使程序最终用户能够在运行时更改窗口中显示的UserControl?一种(快速但不一定是最好的)方法是向窗口添加ContentControl <ContentControl Name="cc" /> 我想出来了。在我的ViewModel中,我有一个名为SelectedUC的Us
<ContentControl Name="cc" />
我想出来了。在我的ViewModel中,我有一个名为
SelectedUC
的UserControl
属性和另一个名为Style
的属性,这是一个enum
类型,它枚举我正在使用的不同的UserControls
。在set
部分Style
属性中,我对属性进行了更改(“SelectedUC”)
SelectedUC属性的get
部分有一个switch case语句,该语句将SelectedUC
字段设置为相应类型的UserControl
的新实例,并将ViewModel(this
)作为参数传递
private MyStyleEnum _style = MyStyleEnum.OneStyle;
public MyStyleEnum Style
{
get { return _style; }
set
{
if (value != _style)
{
_style = value;
OnPropertyChanged("Style");
OnPropertyChanged("SelectedUC");
}
}
}
private UserControl _selectedUC;
public UserControl SelectedUC
{
get
{
switch (Style)
{
case MyStyleEnum.OneStyle:
_selectedUC = new ucOneControl(this);
break;
case MyStyleEnum.AnotherStyle:
_selectedUC = new ucAnotherControl(this);
break;
}
return _selectedUC;
}
set { _selectedUC = value; }
}
在我的MainView
的xaml中,我有一个ContentPresenter
,它的Content
属性绑定到视图模型中的SelectedUC
属性
<ContentPresenter Content="{Binding SelectedUC}" />
EnumToBoolConverter.cs:
public class EnumToBoolConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (parameter.Equals(value))
return true;
else
return false;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return parameter;
}
}
我不确定我是否理解你的问题,但是如果我没有看错的话,就用谷歌搜索一下关于用代码而不是xaml创建绑定的众多教程中的一个。我只是更改了这个问题的标题。也许这会帮助你理解我的问题。
<Window x:Class="MyProject.View.SettingsView"
xmlns:cv="clr-namespace:MyProject.Converters"
xmlns:vm="clr-namespace:MyProject.ViewModel">
<Window.Resources>
<cv:EnumToBoolConverter x:Key="EBConverter"/>
</Window.Resources>
<RadioButton Content="One" IsChecked="{Binding Path=Style, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource ResourceKey=EBConverter}, ConverterParameter={x:Static Member=vm:MyStyleEnum.SingleLine}}"/>
</Window>
public class EnumToBoolConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (parameter.Equals(value))
return true;
else
return false;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return parameter;
}
}