- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个窗口使用 ReactiveUI Interaction 打开第二个窗口作为模态对话框,然后从第二个窗口中的 ListBox 返回数据。
问题是当 .ShowDialog() 完成时,ViewModel 的 SelectedItem 的计算结果总是为 null。我已经确认绑定(bind)工作正常,并且所选项目在对话窗口的 ViewModel 中得到正确更新。只有当我返回交互时,该属性才重置为其默认值(空)。
我在这里整理了一个问题的最小示例:
https://github.com/replicaJunction/ReactiveDialogTest
主要测试逻辑在MainWindowViewModel.cs中。
编辑:这是代码中的一个基本思想片段:
GetNumberFromDialog = new Interaction<Unit, int>();
GetNumberFromDialog.RegisterHandler(interaction =>
{
var vm = new DialogWindowViewModel();
// Get a reference to the view for this VM
var view = Locator.Current.GetService<IViewFor<DialogWindowViewModel>>();
// Set its VM to our current reference
view.ViewModel = vm;
var window = view as Window;
var dialogResult = window.ShowDialog();
// At this point, vm.SelectedNumber is expected be the number the user selected -
// but instead, it always evaluates to 0.
if (true == dialogResult)
interaction.SetOutput(vm.SelectedNumber);
else
interaction.SetOutput(-1);
});
OpenDialog = ReactiveCommand.Create(() =>
{
GetNumberFromDialog.Handle(Unit.Default)
.Where(retVal => -1 != retVal) // If the dialog did not return true, don't update
.Subscribe(retVal =>
{
this.MyNumber = retVal;
});
});
重现问题的步骤:
预期行为:主窗口中“我的号码是”下方的标签应更新为您在列表框中选择的值。
实际行为:标签更新为 0(整数的默认值)。
为什么我的 ViewModel 在对话框关闭时会自行重置?
最佳答案
查看您在 GitHub 上的示例有助于揭示问题。您的 DialogWindow
如下所示:
public partial class DialogWindow : Window, IViewFor<DialogWindowViewModel>
{
public DialogWindow()
{
InitializeComponent();
this.ViewModel = new DialogWindowViewModel();
this.DataContext = this.ViewModel;
this.ViewModel
.WhenAnyValue(x => x.DialogResult)
.Where(x => null != x)
.Subscribe(val =>
{
this.DialogResult = val;
this.Close();
});
}
public DialogWindowViewModel ViewModel { get; set; }
object IViewFor.ViewModel
{
get => ViewModel;
set => ViewModel = (DialogWindowViewModel)value;
}
}
在您的 MainWindowViewModel
中,您将 DialogWindow.ViewModel
属性设置为您的 DialogWindowViewModel
的新实例。问题就出现在这个时候。您的问题是设置 DialogWindow.ViewModel
属性不会 设置 View 的 DataContext
或重新创建 WhenAnyValue
可观察的。这意味着该 View 仍然绑定(bind)到 DialogWindowViewModel
的旧实例(在 DialogWindow
构造函数)。要修复上面的示例代码,您可以简单地避免设置 ViewModel 属性,并使用已在对话框中设置的 ViewModel:
GetNumberFromDialog.RegisterHandler(interaction =>
{
// Get a reference to the view for this VM
var view = Locator.Current.GetService<IViewFor<DialogWindowViewModel>>();
var window = view as Window;
var dialogResult = window.ShowDialog();
// use the ViewModel here that's already set on the DialogWindow
if (true == dialogResult)
interaction.SetOutput(view.ViewModel.SelectedNumber);
else
interaction.SetOutput(-1);
});
关于c# - ReactiveUI:从自定义对话框返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47680814/
我的代码在下面,演示站点在这里:http://glimmer.rstudio.com/kdavenport/test1/ 第一个输入(下拉菜单)加载 global.R 中定义的数据框 第二个输入(下拉
我使用了一个可移植模板创建了一个 Xamarin 应用程序,并且我已经在可移植库和 Android 库中安装了响应式(Reactive) UI。但是,当我将应用程序部署到我的手机并导致触发 Raise
我有 WPF 列表框: 我喜欢使用后面的代码按名称绑定(bind) ListBox 的能力:this.OneWayBind(ViewModel, vm
我喜欢 ReactiveUI 的基于代码的绑定(bind)机制。但是,有时您需要使用 XAML 绑定(bind)。在这些情况下,需要在 View 和 ViewModel 之间正确设置 DataCont
在将我的项目中的 Xamarin Forms 包更新到 3.4.0.1009999 后,当使用 ReactiveUI x.DiscountSliderValue).Throttle(TimeSpan.
我正在测试 ReactiveUI,看起来很不错。 但是,我对 MessageBus 有点困惑。 示例代码: var bus = new MessageBus(); int result = -1; b
我无法在设计时在Visual Studio中使用ViewModelViewHost。这是设计使然还是我设置有误? 在我看来,我有: Locator.CurrentMutable.Initializ
我正在将 MvvmCross 与 ReactiveUI 进行比较,用于 Win Store、WP8、iOS、Droid 上的一个主要制药项目。我们已经选择了 Xamarin。 我对 ReactiveU
RX官方博客上有此example: var scheduler = new TestScheduler(); var xs = scheduler.CreateColdObservable(
ReactiveUI.Routing要求我们在Splat容器(Locator.CurrentMutable)中注册 View 。如果我未在Splat中注册,则无法正常工作。 如果我们正在使用其他一些I
所以,当我为我的系统开发新功能时,我也尝试做 TDD - 遗憾的是,现在对于旧功能来说代码太大了。 但是,我发现有时在测试过程中会遇到困难 - 特别是在使用 Delay 和 Throttle 时。 我
所以,当我为我的系统开发新功能时,我也尝试做 TDD - 遗憾的是,现在对于旧功能来说代码太大了。 但是,我发现有时在测试过程中会遇到困难 - 特别是在使用 Delay 和 Throttle 时。 我
我一直在研究在生产代码中使用响应式 UI 的可行性。有些功能确实很吸引人,但我担心依赖这个库。其中包括: 古怪的命名和约定。例如, protected 成员以小写字母开头,而 RaiseAndSetI
我正在将 WPF 应用程序移植到 Windows 应用商店应用程序。我有一些要放入可移植类库的 View 模型。该代码使用 reactui 框架。我创建了库,并使用 nuget 包管理器将 react
我通过 nuget 下载最新的 ReactiveUI (5.0.2) 到我基于 .NET 4.5 的项目。 我创建了具有一个属性的简单 View 模型类: using System; using Sy
在我使用 ReactiveUI 的 WPF 应用程序中,我注意到一个性能不佳的区域。 我有一个 View 模型,其中包含许多其他轻量级 View 模型(想想 30ish)。这些嵌套的 View 模型很
我有一个关于 reactiveui View 模型的问题。 我的 View 模型上有两个属性,月和年,并希望有一个进一步的输出属性 DateLabel,它将两者结合起来并很好地格式化,例如“2015
我查看了许多 ReactiveUI 示例,但我看不到一个很好的简单示例来说明如何处理异常,即应该向用户显示一条消息。 (如果有一个很好的例子,有人可以指点我吗?)。 我的第一个问题是如何使用 Reac
我有一个窗口使用 ReactiveUI Interaction 打开第二个窗口作为模态对话框,然后从第二个窗口中的 ListBox 返回数据。 问题是当 .ShowDialog() 完成时,ViewM
我有一个 WPF MVVM 应用程序。我的模型对象是我可以完全控制的 POCO。这些对象中的某些属性之间存在关系。 例如:假设我有 public class Model { public Ob
我是一名优秀的程序员,十分优秀!