Extensiones reactivas para .NET (Rx) en WPF - MVVM
Estoy usando extensiones reactivas para NET (Rx) con Caliburn.Micro en mi aplicación WPF. Estoy tratando de portar mi aplicación WPF para usar una arquitectura MVVM y necesito monitorear los cambios en la propiedad Text de un control TextBox.
Si el último cambio de la propiedad Text fue hace más de 3 segundos, debo llamar al método LoadUser de un servicio.
Portar la lógica de mi solución anterior a la nueva solución con arquitectura MVVM.
ANTIGUOXAML:
<TextBox Name="Nick"
Grid.Row="0"
FontSize="14"
Margin="2,2,2,2"
HorizontalAlignment="Stretch"
TextChanged="Nick_TextChanged" />
Encódigo detrás Tengo esto:
...
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){...}
Me gustaría usar Observable.FromEvent en mi clase de modelo de vista. Algo como esto
WPF con MVVMVer:
<TextBox Name="Nick"
Grid.Row="0"
FontSize="14"
Margin="2,2,2,2"
HorizontalAlignment="Stretch"
Micro:Message.Attach="[TextChanged]=[Action TextChanged()]"/>
Ver modelo:
[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()
{
}
}
Mi problema es Observable.FromEvent usa el control TextBox y no sé cómo puedo acceder a este control desde mi clase ViewModel.
Puedo vincular a la propiedad Text de TextBox o puedo vincular un comando a algún evento del control TextBox, pero este método usa un objeto en la Vista.
Gracias por las ideas.