Я использую реактивные расширения для NET (Rx) с Caliburn.Micro в моем WPF приложение. Я пытаюсь перенести свое приложение WPF для использования архитектуры MVVM, и мне нужно отслеживать изменения в свойстве Text элемента управления TextBox.
Если последнее изменение свойства Text было более 3 секунд назад, мне нужно позвонить метод службы LoadUser.
Перенос логики из моего старого решения в новое решение с архитектурой MVVM.
XAML:
<TextBox Name="Nick"
Grid.Row="0"
FontSize="14"
Margin="2,2,2,2"
HorizontalAlignment="Stretch"
TextChanged="Nick_TextChanged" />
В коде за у меня есть следующее:
...
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){...}
Я бы хотел использовать Observable. FromEvent на мой взгляд, класс модели. Примерно так
Представление:
<TextBox Name="Nick"
Grid.Row="0"
FontSize="14"
Margin="2,2,2,2"
HorizontalAlignment="Stretch"
Micro:Message.Attach="[TextChanged]=[Action TextChanged()]"/>
Модель представления:
[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()
{
}
}
Моя проблема - Observable.FromEvent использует элемент управления TextBox, и я не знаю, как мне получить доступ к этому элементу управления из моего класса ViewModel.
Я могу привязать к свойству Text TextBox или я могу привязать команду к некоторому событию элемента управления TextBox, но этот метод использует объект в View.
Благодарю за идеи.