微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用参数在 ReactiveUI 中打开新窗口

如何解决如何使用参数在 ReactiveUI 中打开新窗口

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

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

但是如果我想向“WindowToOpen”传递一个参数,我该怎么做?

谢谢

解决方法

我也找不到任何关于如何在 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 正确执行此操作的示例。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。