Search code examples
xamldata-bindinguwpreactiveui.net-native

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


I'm hitting a weird issue with ReactiveUI and binding where the binding works fine in Debug build but not in Release build.

Here I have the code for a sample app that shows the issue. In Debug builds, as I type something in the textbox the InputText property in the view model gets updated accordingly and when I tap the button it shows the updated input text back to me in a message dialog. But the same code in Release build does not work, as InputText always remains empty.

Anyone knows what's going on here?

<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();   
        });
    }
}

Solution

  • As Matt Whilden mentioned in this thread, using runtime directive approach solves the problem so I'm marking this as the right answer. Many thanks Matt Whilden.