2017-04-08 3 views
1

Je rencontre un problème étrange avec ReactiveUI et la liaison où la liaison fonctionne correctement dans la version Debug mais pas dans la version Release.La liaison ReactiveUI ne fonctionne pas dans la version Release dans une application UWP

Ici, j'ai le code pour un exemple d'application qui montre le problème. Dans les versions de débogage, lorsque je tape quelque chose dans la zone de texte, la propriété InputText dans le modèle de vue est mise à jour en conséquence et lorsque je tape sur le bouton, le texte de mise à jour s'affiche dans une boîte de dialogue. Mais le même code dans Release build ne fonctionne pas car InputText reste toujours vide.

Quelqu'un sait ce qui se passe ici?

<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, avez-vous réellement essayé ce qui précède et conclu qu'il ne suffit pas de reproduire? Le code ci-dessus est littéralement * tout * que j'ai codé dans mon projet d'échantillon et pas une seule ligne est manquante. –

+0

Je suis capable de vous reproduire même sur les derniers outils UWP et .NET natifs. C'est similaire à https://github.com/reactiveui/ReactiveUI/issues/1330, ce qui m'intéresse aussi d'être poursuivi. Vous pouvez vous joindre à la discussion là-bas ou envoyez-moi un courriel à [email protected] Il me faudra probablement un jour ou deux pour creuser. –

+0

Désolé, ma faute. Manqué le paquet tiers 'ReactiveUI' lors du test. Supprimé –

Répondre

0

Comme l'a mentionné Matt Whilden dans this thread, l'utilisation de l'approche de la directive runtime résout le problème et je considère cela comme la bonne réponse. Merci beaucoup Matt Whilden.

1

Ce n'est pas vraiment une réponse à votre question de « ce qui se passe ici », mais je suis le gars qui a déposé cet autre bug Matt Whilden lié et je travaillais autour de lui pour le moment par faisant référence au texte sur l'événement bouton et appelant la commande à partir de là aussi au lieu de lier la commande directement sur le bouton, un peu comme ceci:

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

pas élégant, mais ça marche pour moi parce que je ne suis pas vraiment besoin mettre à jour sur la propriété a changé - juste sur le bouton cliquez. Peut-être que cela fonctionnera pour vous aussi avant que le problème soit résolu.

+0

La valeur null dans Execute est fausse mais cela contourne le problème signalé. Je vais continuer à creuser. Mes notes d'investigation seront dans le fil GitHub. –