如何在WPF中的Window中运行时将一个UserControl切换为另一个UserControl?

时间:2013-01-02 02:45:34

标签: wpf binding user-controls window viewmodel

我有一个窗口的一部分应该显示几个UserControl之一。每个UserControl仅以不同的格式,排列和样式呈现相同的数据。将在窗口的此部分中显示的特定UserControl应由存储在Window的ViewModel中的单个设置确定。

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

2 个答案:

答案 0 :(得分:0)

一种(快速但不一定是最佳)方式是将ContentControl添加到窗口

<ContentControl Name="cc" />

然后根据自己的喜好设置内容。例如。在代码隐藏

中设置它
cc.Content = new UserControl1();

答案 1 :(得分:0)

我明白了。在我的ViewModel中,我有一个名为UserControl的{​​{1}}属性和另一个名为SelectedUC的属性,它是Style类型,它枚举了不同的enum我正在使用。在UserControls属性的set部分,我Style OnPropertyChanged("SelectedUC");属性的get部分有一个switch-case语句,用于设置SelectedUC到相应类型SelectedUC的新实例,并将ViewModel(UserControl)作为参数传递。

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; } } 的xaml中,我有一个MainViewContentPresenter属性绑定到ViewModel中的Content属性。

SelectedUC

在我的<ContentPresenter Content="{Binding SelectedUC}" /> 的xaml中,我有一组SettingsView个,这些RadioButton都绑定到Style属性并使用ConverterConverterParameter }。

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

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