Вопрос

Я использую реактивные расширения для 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}" />
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top