Привязка ReactiveUI не работает в сборке выпуска в приложении UWP

У меня возникла странная проблема с ReactiveUI и привязкой, когда привязка работает нормально в сборке отладки, но не в сборке выпуска.

Здесь у меня есть код для примера приложения, которое показывает проблему. В сборках отладки, когда я что-то ввожу в текстовое поле, свойство InputText в модели представления обновляется соответствующим образом, и когда я нажимаю кнопку, он показывает мне обновленный вводимый текст в диалоговом окне сообщения. Но тот же код в сборке Release не работает, так как 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();   
        });
    }
}

person Meisam Seyed Aliroteh    schedule 08.04.2017    source источник
comment
@Sunteen Wu, вы действительно пробовали описанное выше и пришли к выводу, что этого недостаточно для воспроизведения? Приведенный выше код - это буквально все, что я закодировал в моем примере проекта, и ни одна строка не пропущена.   -  person Meisam Seyed Aliroteh    schedule 10.04.2017
comment
Я могу воспроизвести вашу проблему даже в последних инструментах UWP и .NET Native. Это похоже на github.com/reactiveui/ReactiveUI/issues/1330, который я также заинтересован в том, чтобы за мной гнались. Вы можете присоединиться к обсуждению там или отправить мне электронное письмо на [email protected]. Мне, наверное, понадобится день или два, чтобы покопаться.   -  person MattWhilden    schedule 11.04.2017
comment
Извини, это моя вина. При тестировании пропустил ReactiveUI сторонний пакет. Удалено.   -  person Sunteen Wu    schedule 11.04.2017


Ответы (2)


На самом деле это не ответ на ваш вопрос «что здесь происходит», но я тот парень, который зарегистрировал ту другую ошибку, на которую ссылается Мэтт Уилден, и я пока работал над этим, ссылаясь на текст в событии кнопки и вызывая команду оттуда, вместо того, чтобы привязывать команду непосредственно к кнопке, примерно так:

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

Не элегантно, но это работает для меня, потому что мне действительно не нужно обновлять свойство изменено - просто нажатием кнопки. Возможно, это сработает и для вас, прежде чем проблема будет решена.

person Tyress    schedule 11.04.2017
comment
Нулевое значение в Execute является ложным, но это позволяет обойти указанную проблему. Я буду копать. Мои заметки о расследовании будут в ветке GitHub. - person MattWhilden; 12.04.2017

Как упомянул Мэтт Уилден в этом потоке, использование директивного подхода во время выполнения решает проблему, поэтому я m отметив это как правильный ответ. Большое спасибо Мэтту Уилдену.

person Meisam Seyed Aliroteh    schedule 21.04.2017