1

我正在使用 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 任务有关,但不确定到底发生了什么。

4

1 回答 1

1

这是因为[CallerMethodName]仅在通过 VS2012 编译时有效,RaiseAndSetIfChanged如果要在 VS2010 上编译,则需要使用不同的重载。就像是:

bool? _IsCorrect;  // The naming is Significant
public bool? IsCorrect {
    get { return _IsCorrect; }
    set { this.RaiseAndSetIfChanged(x => x.IsCorrect, value); }
}
于 2013-11-14T05:10:30.577 回答