2017-04-08 2 views
1

Ich bin ein seltsames Problem mit ReactiveUI und Bindung, wo die Bindung in Debug-Build, aber nicht in Release-Build funktioniert.ReactiveUI Binding funktioniert nicht in Release-Build in einer UWP-App

Hier habe ich den Code für eine Beispiel-App, die das Problem zeigt. In Debug-Builds wird die InputText-Eigenschaft im Ansichtsmodell entsprechend aktualisiert. Wenn ich auf die Schaltfläche tippe, wird der aktualisierte Text in einem Nachrichtendialog angezeigt. Derselbe Code in Release-Build funktioniert jedoch nicht, da InputText immer leer bleibt.

Wer weiß, was hier vor sich geht? Diese

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

@Sunteen Wu, haben Sie tatsächlich das oben genannte versucht und kam zu dem Schluss, dass es nicht genug ist zu reproduzieren? Der obige Code ist buchstäblich * alles *, das ich in meinem Beispielprojekt codiert habe und keine einzige Zeile fehlt. –

+0

Ich bin in der Lage, das Problem selbst bei den neuesten UWP- und .NET Native-Tools zu reproduzieren. Es ist ähnlich wie https://github.com/reaceuci/ReactiveUI/issues/1330, was mich ebenfalls interessiert. Sie können sich an der Diskussion beteiligen oder eine E-Mail an [email protected] schreiben. Es wird wahrscheinlich einen oder zwei Tage dauern, bis ich durchgebrochen bin. –

+0

Entschuldigung, meine Schuld. Das 'ReactiveUI' Paket von Drittanbietern wurde beim Testen verpasst. Gelöscht. –

Antwort

0

Wie Matt Whilden in this thread erwähnt, löst die Verwendung der Laufzeit-Direktive das Problem, also markiere ich dies als die richtige Antwort. Vielen Dank Matt Whilden.

1

ist nicht wirklich eine Antwort auf Ihre Frage „Was ist denn hier los“, aber ich bin der Typ, der abgelegt, dass andere Fehler Matt Whilden verknüpft und ich arbeitete um es für den Augenblick durch Bezugnahme auf den Text auf der Schaltfläche Ereignis und den Befehl von dort auch anstelle der Bindung den Befehl direkt auf den Knopf, Art wie diese Aufruf:

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

nicht elegant, aber es funktioniert für mich, weil ich nicht wirklich brauchen Aktualisierung der geänderten Eigenschaft - nur auf Knopfdruck. Vielleicht wird das auch für Sie funktionieren, bevor das Problem gelöst ist.

+0

Die Null in Execute ist falsch, aber das behebt das gemeldete Problem. Ich werde weiter graben. Meine Untersuchungshinweise befinden sich im GitHub-Thread. –

Verwandte Themen