2017-10-05 19 views
3

Je me demandais quel est le meilleur moyen de lier les propriétés de contrôle au CommandParameter dans ReactiveUI? Le BindCommand ci-dessous ne fournit pas un moyen de transmettre le paramètre. La surcharge prend un property in view model ou un IObservable<T> pour les paramètres.Comment lier Combobox à une commande dans ReactiveUI?

Voir

this.WhenActivated(subscription => 
{ 
    subscription(this.BindCommand(
        this.ViewModel, 
        vm => vm.TextCommand, 
        v => v.ComboBox 
        )); 
} 

ViewModel

public class MainPageViewModel : ViewModelBase 
{ 
    public ReactiveCommand<string, Unit> TextCommand { get; set; } 


    public MainPageViewModel() 
    { 
     TextCommand = ReactiveCommand.CreateFromTask<string>(DoSomething); 

    } 

    private Task DoSomething(string selectedText) 
    { 
     return Task.Delay(3000); 
    } 
} 

La méthode DoSomething est appelée avec selectedText comme null chaque fois.

J'ai essayé de passer le IObservable pour ToggleSwitch, mais le comportement n'est pas celui attendu.

Voir

IObservable<bool> toggleOn = this.WhenAnyValue(v => v.Toggle.IsOn); 
this.WhenActivated(subscription => 
{ 
    subscription(this.BindCommand(
       this.ViewModel, 
       vm => vm.ToggleCommand, 
       v => v.Toggle, toggleOn)); 
} 

ViewModel

ToggleCommand = ReactiveCommand.CreateFromTask<bool>(Toggled); 

private Task Toggled(bool toggleState) 
{ 
    return Task.Delay(3000); 
} 

Dans le code ci-dessus, je ne réussi à obtenir le toggleState, mais il est le dernier état non le nouvel état de la ToggleSwitch . En outre, je ne pouvais pas faire ce travail de ComboBox. Je pense qu'il est très courant de passer les paramètres de commande de la vue et il devrait y avoir un moyen plus facile de l'atteindre. Qu'est-ce que je rate? J'utilise l'application UWP.

Merci

+0

Les Combobox n'ont pas de "Command" par nature mais normalement, est-ce que vous essayez de déclencher une commande sur la valeur sélectionnée? –

+0

Vous avez peut-être raison, mais la commande fonctionne comme annoncé. Chaque fois que je change la sélection dans ComboBox ou ToggleSwitch, la commande est exécutée. La question est comment passer un paramètre à cette commande qui est une propriété d'un contrôle, dans le cas de 'ComboBox' il peut être' SelectedItem' ou 'ToggleSwitch'' IsOn'. – resp78

+1

Ne serait pas préférable de faire une liaison à une propriété de votre machine virtuelle à l'élément SelectedItem, alors vous pouvez avoir un WhenAnyValue (x => x ....). InvokeCommand() à la place. Ensuite, vous avez un accès complet à votre propriété. C'est si vous avez besoin de la commande en raison d'une tâche/observable que vous devez attendre. –

Répondre

0

Je suppose que vous ne pouvez lier des commandes à des événements, pas directement aux propriétés (peut-être que je me trompe). Que se passe-t-il si vous vous abonnez à l'événement SelectedValueChanged (Impossible de mémoriser le nom de l'événement) dans la liste déroulante, puis exécutez la commande manuellement?

this.ComboBox.Events().SelectedValueChanged 
    .Select(_ => ComboBox.Text) 
    .InvokeCommand(this, vm => vm.ViewModel.TextCommand);