0

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

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

4

2 回答 2

0

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

<ContentControl Name="cc" />

然后随意设置它的内容。例如。在代码隐藏中设置它

cc.Content = new UserControl1();
于 2013-01-02T04:41:53.973 回答
0

我想到了。在我的 ViewModel 中,我有一个UserControl名为 的属性SelectedUC,以及另一个名为的属性Style,它是一种enum类型,它枚举了UserControls我正在使用的不同之处。在我拥有的属性set部分中,该部分属性有一个 switch-case 语句,它将字段设置为相应类型的新实例,并将 ViewModel ( ) 作为参数传递。StyleOnPropertyChanged("SelectedUC");getSelectedUCSelectedUCUserControlthis

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绑定到SelectedUCViewModel 中的属性。

<ContentPresenter Content="{Binding SelectedUC}" />

在我SettingsView的 xaml 中,我有一组RadioButtons 都绑定到Style属性并使用 aConverterConverterParameter

<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;
    }
}
于 2013-01-04T13:49:44.287 回答