【问题标题】:How to open new window in ReactiveUI with params如何使用参数在 ReactiveUI 中打开新窗口
【发布时间】:2021-05-14 13:40:27
【问题描述】:

我正在寻找使用尊重 MVVM ReactiveUi 原则的参数打开新窗口的最佳方式。现在我正在使用 Splat 的服务位置打开新窗口。 假设我想在单击 MainWindow 视图上的按钮时打开新窗口。 目前:

  1. 我在管理MainWindow View的ViewModel方法中调用Locator.Current.GetService("WindowToOpen"),获取要打开的窗口实例
  2. 我调用实例“WindowToOpen”的 Show 或 ShowDialog 方法

但是如果我想将参数传递给“WindowToOpen”该怎么办?

谢谢

【问题讨论】:

    标签: c# wpf reactiveui


    【解决方案1】:

    我也找不到任何关于如何在 WPF 中使用 ReactiveUI 打开新窗口的示例。

    我最终做的是向我的视图添加一个依赖属性(因为你不能将参数传递给视图构造函数)。例如,如果您需要将字符串值 userName 传递到新窗口,则必须将以下依赖项属性添加到该视图类:

    public static readonly DependencyProperty UserNameProperty =
        DependencyProperty.Register("UserName", typeof(string), typeof(YourView),
            new PropertyMetadata(default(string)));
    
    public string UserName
    {
        get => (string) GetValue(UserNameProperty);
        set => SetValue(UserNameProperty, value);
    }
    
    

    然后,在创建视图时,您可以为该属性分配一个值。在你的情况下:

    Window window = Locator.Current.GetService("WindowToOpen") as Window;
    window.PropertyToChange = valueOfProperty;
    window.Show();
    

    如果您需要视图模型中的属性值(如果您使用 MVVM,您可能会这样做),请将依赖项属性绑定到视图模型中的属性。这必须在视图的WhenActivated 方法中完成:

    this.WhenActivated(disposables =>
    {
        // Instantiate the view model just in case it is null
        ViewModel ??= Locator.Current.GetService<YourView>() ??
                      throw new InvalidOperationException("YourViewis not registered.");
    
        this.WhenAnyValue(view => view.UserName)
            .BindTo(ViewModel, viewModel => viewModel.UserName)
            .DisposeWith(disposables);
    
        // other bindings
    });
    

    我知道这一切都让人感觉非常笨拙和凌乱。但我还没有找到任何关于如何仅使用 ReactiveUI 正确执行此操作的示例。

    【讨论】:

    • 谢谢。但我不知道您提出的解决方案或提供的解决方案是否更好: 1. 使用参数重载视图的 Show 方法 2. 在重载方法“Show(object param)”中将参数复制到私有字段_param 并返回 "Show()" 3. 使用 "WhenAnyValue" 将 View 的私有字段 _param 与 ViewModel 的属性绑定
    猜你喜欢
    • 2021-06-09
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多