Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于单选按钮选择动态添加用户控件-WPF_Wpf - Fatal编程技术网

基于单选按钮选择动态添加用户控件-WPF

基于单选按钮选择动态添加用户控件-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模

我正在寻找一种基于单选按钮选择动态加载用户控件的解决方案。下面解释这个问题。 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模式帮我解决这个问题吗


    提前感谢。

    您可以尝试以下内容:

    在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)”。您是否能够提供代码段。谢谢。