在WPF的窗口中,如何在运行时将一个用户控件切换到另一个用户控件?

在WPF的窗口中,如何在运行时将一个用户控件切换到另一个用户控件?,wpf,binding,user-controls,window,viewmodel,Wpf,Binding,User Controls,Window,Viewmodel,我有一个窗口的一部分,它应该显示几个用户控件中的一个。每个UserControl都以不同的格式、排列和样式显示相同的数据。窗口的此部分中显示的特定用户控件应由存储在窗口的ViewModel中的单个设置确定 如何使程序最终用户能够在运行时更改窗口中显示的UserControl?一种(快速但不一定是最好的)方法是向窗口添加ContentControl <ContentControl Name="cc" /> 我想出来了。在我的ViewModel中,我有一个名为SelectedUC的Us

我有一个窗口的一部分,它应该显示几个用户控件中的一个。每个UserControl都以不同的格式、排列和样式显示相同的数据。窗口的此部分中显示的特定用户控件应由存储在窗口的ViewModel中的单个设置确定

如何使程序最终用户能够在运行时更改窗口中显示的UserControl?

一种(快速但不一定是最好的)方法是向窗口添加ContentControl

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