ReactiveUI 绑定在 UWP 应用程序的发布版本中不起作用

ReactiveUI Binding does not work in Release build in a UWP app

我在 ReactiveUI 和绑定中遇到了一个奇怪的问题,绑定在调试版本中工作正常,但在发布版本中却不行。

我这里有一个示例应用程序的代码,它显示了这个问题。在调试版本中,当我在文本框中键入内容时,视图模型中的 InputText 属性 会相应更新,当我点击按钮时,它会在消息对话框中向我显示更新的输入文本。但是 Release build 中的相同代码不起作用,因为 InputText 始终为空。

有人知道这里发生了什么吗?

<Page x:Class="RxBind.MainPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel>
        <TextBox x:Name="MyTextBox" Margin="10"/>
        <Button x:Name="MyButton" Content="Show Dialog" Margin="10"/>
    </StackPanel>
</Page>



public sealed partial class MainPage : IViewFor<MainPageViewModel>
{
    public MainPage()
    {
        InitializeComponent();

        ViewModel = new MainPageViewModel();

        this.WhenActivated(d =>
        {
            d(this.BindCommand(ViewModel, vm => vm.MyButtonCommand, v => v.MyButton));
            d(this.Bind(ViewModel, vm => vm.InputText, x => x.MyTextBox.Text));
        });
    }

    #region IViewFor impl

    object IViewFor.ViewModel
    {
        get { return ViewModel; }
        set { ViewModel = (MainPageViewModel)value; }
    }

    public MainPageViewModel ViewModel { get; set; }

    #endregion //IViewFor impl
}



public class MainPageViewModel : ReactiveObject
{
    private string _inputText = string.Empty;
    public string InputText
    {
        get { return _inputText; }
        set { this.RaiseAndSetIfChanged(ref _inputText, value); }
    }

    public ReactiveCommand<Unit, Unit> MyButtonCommand { get; }

    public MainPageViewModel()
    {
        MyButtonCommand = ReactiveCommand.CreateFromTask(async () =>
        {
            await new MessageDialog($"InputText={InputText}").ShowAsync();   
        });
    }
}

这并不是您 "what's going on here," 问题的真正答案,但我是提交 Matt Whilden 链接到的另一个错误的人,我暂时通过参考文本解决了这个问题按钮事件并从那里调用命令,而不是将命令直接绑定到按钮,有点像这样:

d(Observable.FromEventPattern<RoutedEventHandler, object, RoutedEventArgs>(h => MyButton.Click += h, h => MyButton.Click -= h).Subscribe(x=>
{
  ViewModel.InputText = MyTextBox.Text;
  ViewModel.MyButtonCommand.Execute(null);
}));

不优雅,但对我有用,因为我真的不需要更新 属性 更改 - 只需单击按钮即可。在问题解决之前,也许这对您也有用。

正如 Matt Whilden 在 this thread 中提到的那样,使用运行时指令方法可以解决问题,因此我将其标记为正确答案。非常感谢 Matt Whilden。