我有一个窗口的一部分应该显示几个用户控件之一。每个 UserControl 呈现相同的数据,只是以不同的格式、排列和样式。将在 Window 的这一部分中显示的特定 UserControl 应由存储在 Window 的 ViewModel 中的单个设置确定。
如何使程序最终用户可以更改在运行时显示在窗口中的 UserControl?
我有一个窗口的一部分应该显示几个用户控件之一。每个 UserControl 呈现相同的数据,只是以不同的格式、排列和样式。将在 Window 的这一部分中显示的特定 UserControl 应由存储在 Window 的 ViewModel 中的单个设置确定。
如何使程序最终用户可以更改在运行时显示在窗口中的 UserControl?
一种(快速但不一定是最好的)方法是将 ContentControl 添加到您的窗口
<ContentControl Name="cc" />
然后随意设置它的内容。例如。在代码隐藏中设置它
cc.Content = new UserControl1();
我想到了。在我的 ViewModel 中,我有一个UserControl
名为 的属性SelectedUC
,以及另一个名为的属性Style
,它是一种enum
类型,它枚举了UserControls
我正在使用的不同之处。在我拥有的属性set
部分中,该部分属性有一个 switch-case 语句,它将字段设置为相应类型的新实例,并将 ViewModel ( ) 作为参数传递。Style
OnPropertyChanged("SelectedUC");
get
SelectedUC
SelectedUC
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; }
}
在我MainView
的 xaml 中,我有一个ContentPresenter
属性Content
绑定到SelectedUC
ViewModel 中的属性。
<ContentPresenter Content="{Binding SelectedUC}" />
在我SettingsView
的 xaml 中,我有一组RadioButton
s 都绑定到Style
属性并使用 aConverter
和ConverterParameter
。
<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;
}
}