Reaktive Erweiterungen für .NET (RX) in WPF - MVVM
-
14-10-2019 - |
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.
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}" />