Реактивные расширения для .NET (RX) в WPF - MVVM
-
14-10-2019 - |
Вопрос
Я использую реактивные расширения для net (rx) с caliburn.micro в моем приложении WPF. Я пытаюсь перенести свое приложение WPF, чтобы использовать архитектуру MVVM, и мне нужно отслеживать изменения в текстовом свойстве управления текстовым полетом.
Если последнее изменение текстового свойства было более 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.fment в моем классе модели. Что-то вроде этого
WPF с MVVM
Вид:
<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()
{
}
}
Моя проблема наблюдается. Fromental использует управление текстовым полетом, и я не знаю, как я могу получить доступ к этому элементу управления из моего класса ViewModel.
Я могу привязаться к текстовому свойству Textbox, или я могу привязать команду с каким -то событием элемента управления текстовым полетом, но этот метод использует объект в представлении.
Спасибо за идеи.
Решение
Добавить Nick
свойство в вашем просмотре и реализации INotifyPropertyChanged
. Анкет Тогда вы можете сделать это
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);
И тогда ваш XAML будет чем -то вроде этого
<TextBox Name="Nick"
Grid.Row="0"
FontSize="14"
Margin="2,2,2,2"
HorizontalAlignment="Stretch"
Text="{Binding Nick, UpdateSourceTrigger=PropertyChanged}" />