在您的 MainViewModel 中创建一个属性来保存 RadioControlViewModel,并创建一个属性来保存选定的 OptionViewModel。在您的构造函数中,注册 RadioControlViewModel 的 OptionSelectionChanged 事件。 EventHandler 方法应将 OptionViewModel 的值更改为 ViewModel 的实例,该实例表示您希望为该选择显示的控件。代码中声明“etcetera”的所有 cmets 表示为选项 3 和 4 添加相同的前面代码。
MainViewModel
public class MainViewModel
{
private RadioControlViewModel _rcViewModel;
public RadioControlViewModel RcViewModel
{
get { return _rcViewModel; }
set
{
_rcViewModel = value;
RaisePropertyChanged("RcViewModel");
}
}
private OptionViewModelBase _optionViewModel;
public OptionViewModelBase OptionViewModel
{
get { return _optionViewModel; }
set
{
_optionViewModel = value;
RaisePropertyChanged("OptionViewModel");
}
}
public MainViewModel()
{
RcViewModel = new RadioControlViewModel();
RcViewModel.OptionSelectionChanged += RcViewModel_OptionSelectionChanged;
}
private void RcViewModel_OptionSelectionChanged(object sender, OptionSelectionChangedEventArgs e)
{
if (e.Selection == null)
{
OptionViewModel = null;
return;
}
switch (e.Selection)
{
case Option.OptionOne:
OptionViewModel = new OptionOneViewModel();
break;
case Option.OptionTwo:
OptionViewModel = new OptionTwoViewModel();
break;
// etcetera
}
}
}
在您的 MainView.Resources 中,您将放置 DataTemplates,将每个 OptionViewModel 映射到相应的 OptionView。第一个 StackPanel 将 RadioControlView 的 DataContext 绑定到 MainViewModel 的 RadioControlViewModel 属性。在第二个 StackPanel 中,您使用 ContentPresenter 并将 Content 属性绑定到 MainViewModel 的 OptionViewModel 属性。 DataTemplates 会告诉它如何呈现这个。
主视图
<Window.Resources>
<DataTemplate DataType="{x:Type viewmodel:OptionOneViewModel}">
<view:OptionOneView />
</DataTemplate>
<DataTemplate DataType="{x:Type viewmodel:OptionTwoViewModel}">
<view:OptionTwoView />
</DataTemplate>
<!-- etcetera -->
</Window.Resources>
<Grid>
<StackPanel>
<view:RadioControlView DataContext="{Binding RcViewModel}" />
</StackPanel>
<StackPanel>
<ContentPresenter Content="{Binding OptionViewModel}" />
</StackPanel>
</Grid>
RadioControlViewModel 将有一个 OptionSelectionChanged 事件,只要其中一个绑定的 RadioButton 将其属性设置为 true,就会引发该事件。
RadioControlViewModel
public class RadioControlViewModel
{
public event EventHandler<OptionSelectionChangedEventArgs> OptionSelectionChanged;
private bool _optionOneSelected;
public bool OptionOneSelected
{
get { return _optionOneSelected; }
set
{
_optionOneSelected = value;
RaisePropertyChanged("OptionOneSelected");
if (value)
RaiseOptionSelectionChanged(Option.OptionOne);
}
}
private bool _optionTwoSelected;
public bool OptionTwoSelected
{
get { return _optionTwoSelected; }
set
{
_optionTwoSelected = value;
RaisePropertyChanged("OptionTwoSelected");
if (value)
RaiseOptionSelectionChanged(Option.OptionTwo);
}
}
// etcetera
private void RaiseOptionSelectionChanged(Option selection)
{
var handler = OptionSelectionChanged;
if (handler == null)
return;
handler(this, new OptionSelectionChangedEventArgs(selection));
}
}
前面的代码假设您将创建一个 OptionSelectionChangedEventArgs 类并拥有一个名为 Option 的枚举。需要进行一些调整,例如您的 MainViewModel 构造函数可能希望将 OptionViewModel 属性设置为将初始化为选中的选项。