我正在使用 Reactive UI 和一个简单的示例。
当用户在文本框中键入正确的短语时,我希望启用按钮的命令。我已按如下方式设置视图模型:
public class MainWindowViewModel : ReactiveObject, IMainWindowViewModel
{
private string _text;
private bool? _isCorrect;
private IReactiveCommand _closeCommand;
private readonly IObservable<bool> _canClose;
public MainWindowViewModel()
{
_canClose = this.WhenAny(c => c.IsCorrect, (c) =>
{
// this fires once on initialization if compiled in VS 2010.
return c.Value == true;
});
//var canClose = this.WhenAny(m => m.Text, c =>
// {
// return "Correct Text".Equals(c.Value);
// });
this.CloseCommand = new ReactiveCommand( _canClose);
this.CloseCommand.Subscribe(c => Debug.WriteLine("Ok pressed"));
}
public IReactiveCommand CloseCommand
{
get { return _closeCommand; }
set { this.RaiseAndSetIfChanged(ref _closeCommand, value); }
}
public string Text
{
get { return _text; }
set
{
this.RaiseAndSetIfChanged(ref _text, value);
CheckTextStatus();
}
}
public bool? IsCorrect
{
get { return _isCorrect; }
set { this.RaiseAndSetIfChanged(ref _isCorrect, value); }
}
private void CheckTextStatus()
{
this.IsCorrect = null;
if (Text.Equals("Correct Text"))
{
this.IsCorrect = true;
}
else if (!"Correct Text".StartsWith(Text))
{
this.IsCorrect = false;
}
}
}
我正在使用 Reactive UI 4.6,因为我们必须支持 XP (.NET 4.0) 一段时间。
_canClose WhenAny
唯一在初始化时触发一次,并且在属性更改时永远不会触发IsCorrect
。
但是,此行为仅在 VS 2010 中编译时发生。如果我在 VS2012 或 MSBuild 中编译,它可以正常工作。
我假设它与 BCL .target MSBuild 任务有关,但不确定到底发生了什么。