wpf - 将复杂对象传递给子窗口

标签 wpf mvvm dependency-properties

牢记MVVM,打开子窗口(例如,修改主窗口上的选定项目)的正确方法是什么?

这是我所拥有的:MainWindow.xaml(在MainWindow.xaml.cs中,它会将MainVM分配为其自己的DataContext)

我还希望拥有:ChildWindow.xaml和准系统ChildWindow.xaml.cs,并在控件后面带有ChildVM。

因此,现在:

  • 如何弹出ChildWindow并将一些对象Data传递给它ChildVM
  • 获取结果(是/否)和结果数据(有些复杂
    对象)返回MainVM
  • 作为奖励,可以观察到Data中的变化
    MainVM处理,而由ChildVM处理?

  • 这是我尝试的方法-它不能解决所有问题,但这是否是正确的方向?
  • 对于(2),我创建了Window的子类DialogWindow,它具有3个DependencyProperties:Data(用于输入数据),ResultData(用于输出数据)和ResultValue(用于 bool 结果)。
  • ResultDataResultValue都使用Binding由ChildVMDialogWindow设置,并且当设置ResultValue时,DialogWindow关闭。
  • 目前,从MainWindow.xaml.cs启动ChildWindow(出于所有意图和目的)-有点不好。然后,我可以传递一些输入数据,如下所示:
    ChildDialogWindow w = new ChildDialogWindow();w.Data = myDataObj;

  • 因此,现在我需要在ChildVM上拥有一个属性Data,并在ChildDialogWindow.xaml.cs中进行设置。再次,使.xaml.cs变厚。

    我认为,避免MainWindow.xaml.cs的更好方法可能是某种DialogService,它作为依赖项传递给MainVM。但是,然后如何将值传递给ChildVM呢?

    最佳答案

    试试这个。
    制作一个DialogService.cs

    public class DialogService
    {
        public void Show(FrameworkElement view, ChildViewModel ChildVM)
        {
             Window window = new Window();
             window.Content = view;
             window.DataContext = ChildVM;
    
             // For closing this dialog using MVVM
             ChildVM.RequestClose += delegate
             {
                window.Close();
             };
    
             window.Show();
        }
    }
    

    现在在ChildVm类中,添加此
    public ICommand CloseCommand
        {
            get
            {
                if (_closeCommand == null)
                    _closeCommand = new RelayCommand(param => this.OnRequestClose());
    
                return _closeCommand;
            }
        }
    
        public event EventHandler RequestClose;
    
        void OnRequestClose()
        {
            EventHandler handler = this.RequestClose;
            if (handler != null)
                handler(this, EventArgs.Empty);
        }
    

    现在,以这种方式启动
    public void OpenChildDailog()
        {
        DialogService service = new DialogService();
        ChildViewModel childVM = new ChildViewModel();
        childVM.Data = ; // Assign whatever you want
        childVM.ResultData = ; 
    
        service.Show(new ChildView(), childVM);
    
        // Now get the values when the child dailog get closed
    
        var retVal = childVM.ResultValue;
    
    }
    

    关于wpf - 将复杂对象传递给子窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17763665/

    相关文章:

    c# - 为什么 RelayCommand<T>.Execute 采用对象而不是 T?

    c# - 注销使用 DependencyProperty.RegisterAttached 创建的属性

    dependency-properties - 是否可以使用已编译的绑定(bind) (x :Bind) with Relative Source, Templated Parent

    c# - WPF 弹出控件 - 查找 X、Y 坐标

    c# - 垂直对齐 WPF 中文本 block 的顶部

    c# - 扩展选择列表绑定(bind)问题

    wpf - DependencyProperty默认值

    c# - WPF MVVM 防止选项卡更改

    c# - 如何隐藏/删除 WPF ColumnHeaderStyle 列标题?

    c# - wpf mvvm 在数据网格中显示可观察集合