基于单选按钮选择动态添加用户控件-WPF
我正在寻找一种基于单选按钮选择动态加载用户控件的解决方案。下面解释这个问题。 1.我有一个基本窗口xaml(主窗口)。这有两个堆栈面板,SP1和SP2。基于单选按钮选择动态添加用户控件-WPF,wpf,Wpf,我正在寻找一种基于单选按钮选择动态加载用户控件的解决方案。下面解释这个问题。 1.我有一个基本窗口xaml(主窗口)。这有两个堆栈面板,SP1和SP2。 2.我已经创建了5个用户控件 2.1单选按钮UC==>4个单选按钮。 2.2选项1 UC 2.3选项2 UC 2.4选项3 UC 2.5选项4 UC 无线电UC在设计时加载到主窗口的SP1中 根据单选按钮的选择,应在SP2中动态加载4个选项UC中的一个 我已尝试在所附图片中解释上述内容 我不知道,因为我不太了解WPF。有谁能用WPF MVVM模
2.我已经创建了5个用户控件 2.1单选按钮UC==>4个单选按钮。 2.2选项1 UC 2.3选项2 UC 2.4选项3 UC 2.5选项4 UC
提前感谢。您可以尝试以下内容: 在XAML中:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.Resources>
<local:VisibilityConverter x:Key="visibilityConverter" />
</Grid.Resources>
<StackPanel>
<StackPanel>
<RadioButton Content="one" GroupName="a" Name="one"/>
<RadioButton Content="two" GroupName="a" Name="two"/>
</StackPanel>
<StackPanel >
<RadioButton Content="linked to one" Visibility="{Binding ElementName=one, Path=IsChecked, Converter={StaticResource visibilityConverter}}"/>
<RadioButton Content="linked to two" Visibility="{Binding ElementName=two, Path=IsChecked, Converter={StaticResource visibilityConverter}}"/>
</StackPanel>
</StackPanel>
</Grid>
</Window>
我相信您的XAMl看起来会有点不同,但概念是一样的。我希望。在主视图模型中创建一个属性来保存RadioControlViewModel,并创建一个属性来保存所选选项ViewModel。在构造函数中,注册RadioControlViewModel的OptionSelectionChanged事件。EventHandler方法应将OptionViewModel的值更改为ViewModel的实例,该实例表示要为该选择显示的控件。代码中说明“等”的所有注释意味着为选项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
}
}
}
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));
}
}
在MainView.Resources中,您将放置将每个OptionViewModel映射到相应OptionView的数据模板。第一个StackPanel将RadioControlView及其DataContext绑定到MainViewModel的RadioControlViewModel属性。在第二个StackPanel中,使用ContentPresenter并将Content属性绑定到MainViewModel的OptionViewModel属性。DataTemplates将告诉它如何呈现这一点
MainView
<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事件,每当其中一个绑定的单选按钮将其属性设置为true时,它就会引发该事件
RadioControlViewModel
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
}
}
}
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));
}
}
公共类RadioControlViewModel
{
公共事件事件处理程序选项SelectionChanged;
已选择私人布尔_选项;
已选择公共bool选项
{
获取{return\u optionOneSelected;}
设置
{
_optionOneSelected=值;
RaiseProperty变更(“选择的期权”);
如果(值)
RaiseOptionSelectionChanged(Option.OptionOne);
}
}
已选择私人bool_optiontwo;
已选择公共布尔选项
{
获取{return\u optionTwoSelected;}
设置
{
_optionTwoSelected=值;
RaisePropertyChanged(“选项WOSELECTED”);
如果(值)
RaiseOptionSelectionChanged(Option.OptionTwo);
}
}
//等等
private void RaiseOptions selection已更改(选项选择)
{
var handler=OptionSelectionChanged;
if(handler==null)
回来
处理程序(此,新选项SelectionChangedEventArgs(选择));
}
}
前面的代码假设您将创建一个OptionSelectionChangedEventArgs类,并有一个名为Option的枚举。需要进行一些调整,例如您的MainViewModel构造函数可能希望将OptionViewModel属性设置为将初始化为选中的选项。感谢您的响应,但这可能不起作用,正如我所提到的,单选按钮来自不同的用户控件。我必须从父主窗口视图模型处理这个问题,我不知道。没有必要检查您的视图模型。如果向usercontrol添加依赖项属性。您可以替换现在对您自己的自定义属性可见的绑定,并将选定的radiobutton信息获取到您的usercontrol中。通过这种方式,您可以在视图和XAML级别上查看内容。在我看来更清晰。看看我对这个问题的回答(在这个答案中有一个指向先前答案的链接,该答案也需要该链接),基本上你会让单选按钮ViewModel引发一个SelectionChanged事件,你的MainViewModel将被注册以执行该事件。然后,MainViewModel将为所需的UserControl将属性(类型ViewModelBase)设置为适当的ViewModel类型,DataTemplates将自动更改UI。这是我计划实现的类型,但我不知道如何实现“引发SelectionChanged事件,您的MainViewModel将被注册以执行该事件。然后,MainViewModel将设置属性(类型ViewModelBase)”。您是否能够提供代码段。谢谢。