我有一个窗口的一部分应该显示几个UserControl之一。每个UserControl仅以不同的格式,排列和样式呈现相同的数据。将在窗口的此部分中显示的特定UserControl应由存储在Window的ViewModel中的单个设置确定。
如何使程序最终用户可以在运行时更改窗口中显示的UserControl?
答案 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中,我有一个MainView
,ContentPresenter
属性绑定到ViewModel中的Content
属性。
SelectedUC
在我的<ContentPresenter Content="{Binding SelectedUC}" />
的xaml中,我有一组SettingsView
个,这些RadioButton
都绑定到Style
属性并使用Converter
和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;
}
}