Frage

Ich verwende reaktive Erweiterungen für Net (RX) mit Caliburn.micro in meiner WPF -App. Ich versuche, meine WPF -App zu portieren, um eine MVVM -Architektur zu verwenden, und ich muss Änderungen in der Texteigenschaft eines Textbox -Steuerelements überwachen.

Wenn die letzte Änderung der Texteigenschaft vor mehr als 3 Sekunden betrug, muss ich die Loaduser -Methode eines Dienstes aufrufen.

Portion der Logik von meiner alten Lösung bis zur neuen Lösung mit MVVM -Architektur.

ALT

Xaml:

<TextBox Name="Nick" 
         Grid.Row="0"
         FontSize="14"
         Margin="2,2,2,2" 
         HorizontalAlignment="Stretch" 
         TextChanged="Nick_TextChanged" />

Im Code dahinter Ich habe das:

...

Observable.FromEvent<TextChangedEventArgs>(Nick, "TextChanged")
          .Select(e => ((TextBox)e.Sender).Text)
          .Where(text => text.Length > 3)               
          .Do(LoadUser)     
          .Throttle(TimeSpan.FromSeconds(3000))     
          .Subscribe(LoadUser);

...
private  void LoadUser(string text){...}

Ich möchte in meiner Ansichtsmodellklasse Observable.FreMevent verwenden. Etwas wie das

WPF mit MVVM

Aussicht:

<TextBox Name="Nick" 
         Grid.Row="0"
         FontSize="14"
         Margin="2,2,2,2" 
         HorizontalAlignment="Stretch"
         Micro:Message.Attach="[TextChanged]=[Action TextChanged()]"/>

Modell anzeigen:

[Export(typeof(IAddFriendViewModel))]
public class AddFriendViewModel : Screen, IAddFriendViewModel
{
    private string _nick;

    public string Nick
    {
        get { return _nick; }
        set
        {
            _nick = value;
            NotifyOfPropertyChange(()=>Nick);
        }
    }

    ...

    //how can I access to textbox control Nick in view from view model class?
    Observable.FromEvent<TextChangedEventArgs>(Nick, "TextChanged")
              .Select(e => ((TextBox)e.Sender).Text)
              .Where(text => text.Length > 3)
              .Do(LoadUser)
              .Throttle(TimeSpan.FromSeconds(3000))
              .Subscribe(LoadUser);
    ...

    private void LoadUser(string text)
    { }

    public void TextChanged()
    {
    }
}

Mein Problem ist beobachtbar. FROMEvent verwendet die Textbox -Steuerung und ich weiß nicht, wie ich auf diese Steuerung aus meiner ViewModel -Klasse zugreifen kann.

Ich kann an die Texteigenschaft des Textfelds binden oder einen Befehl an einen Ereignis des Textbox -Steuerelements binden. Diese Methode verwendet jedoch ein Objekt in der Ansicht.

Vielen Dank für Ideen.

War es hilfreich?

Lösung

Füge hinzu ein Nick Eigenschaft zu Ihrem ViewModel und implementieren INotifyPropertyChanged. Dann können Sie das tun

Observable.FromEventPattern<PropertyChangedEventArgs>(this, "PropertyChanged")
          .Where(e => e.EventArgs.PropertyName == "Nick")
          .Select(_ => this.Nick)
          .Where(text => text.Length > 3)
          //Subscribe will call LoadUser, no need for the extra Do(...)
          .Throttle(TimeSpan.FromSeconds(3000))
          .Subscribe(LoadUser);  

Und dann wäre dein XAML so etwas

<TextBox Name="Nick" 
         Grid.Row="0"
         FontSize="14"
         Margin="2,2,2,2" 
         HorizontalAlignment="Stretch"
         Text="{Binding Nick, UpdateSourceTrigger=PropertyChanged}" />
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top