2010-08-08 4 views
2

Я просто читал Rx HOL NET. После обнаружения (пример использует Windows Forms):Как получить поток событий Rx Observable внутри MVVM ViewModel

var moves = Observable.FromEvent<MouseEventArgs>(frm, "MouseMove"); 

Интересно, как я могу создать экземпляр и передать ссылку на двигаются к ViewModel в некоторой настройке WPF MVVM? По моему мнению, имеет смысл попробовать и фильтровать этот поток данных внутри ViewModel.

Или, как сделать что-то подобное для ввода клавиатуры в TextBox? В этом случае вы не могли бы, например, приложить некоторое поведение маскировки текста к элементу управления в XAML, но вместо этого позволить Observer в VM-фильтре и проверять ввод на клавиатуре.

Неужели я полностью покинул трек?

ответ

5

Вот пример того, как вы могли реализовать словарь веб-службы в MVVM мода. Она состоит из трех частей:

  1. Класса ObservablePropertyBacking, подложка для свойств (Т), которые также реализуют IObservable
  2. Класса MyViewModel. Он содержит свойство CurrentText, которое использует ObservablePropertyBacking в качестве резервного хранилища. Он также отмечает ценность этого свойства и использует его для вызова веб-службы словаря.
  3. MainView.xaml, который содержит текстовое поле. Свойство Text имеет двустороннюю привязку к свойству CurrentText в модели представления.

MyViewModel.cs:

class MyViewModel: INotifyPropertyChanged 
{ 
    #region INotifyPropertyChanged implementation 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void RaisePropertyChanged(string p) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(p)); 
    } 

    #endregion 

    public MyViewModel() 
    { 
     SetupProperties(); 
    } 

    #region CurrentText 

    /* We use a special class for backing of the CurrentText property. This object 
    * holds the value of the property and also dispatches each change in an observable 
    * sequence, i.e. it implements IObservable<T>. 
    */ 
    private ObservablePropertyBacking<string> _textInput; 
    public string CurrentText 
    { 
     get { return _textInput.Value; } 
     set 
     { 
      if (value == _textInput.Value) { return; } 
      _textInput.Value = value; 
      RaisePropertyChanged("CurrentText"); 
     } 
    } 

    #endregion 

    /* Create property backing storage and subscribe UpdateDictionary to the observable 
     * sequence. Since UpdateDictionary calls a web service, we throttle the sequence. 
     */ 
    private void SetupProperties() 
    { 
     _textInput = new ObservablePropertyBacking<string>(); 
     _textInput.Throttle(TimeSpan.FromSeconds(1)).Subscribe(UpdateDictionary); 
    } 

    private void UpdateDictionary(string text) 
    { 
     Debug.WriteLine(text); 
    } 
} 

ObservablePropertyBacking.cs:

public class ObservablePropertyBacking<T> : IObservable<T> 
{ 
    private Subject<T> _innerObservable = new Subject<T>(); 

    private T _value; 
    public T Value 
    { 
     get { return _value; } 
     set 
     { 
      _value = value; 
      _innerObservable.OnNext(value); 
     } 
    } 

    public IDisposable Subscribe(IObserver<T> observer) 
    { 
     return _innerObservable 
      .DistinctUntilChanged() 
      .AsObservable() 
      .Subscribe(observer); 
    } 
} 

MainPage.xaml:

<Window 
    x:Class="RxMvvm_3435956.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <TextBox 
     Text="{Binding CurrentText, UpdateSourceTrigger=PropertyChanged}" /> 
    </Grid> 
    </Window> 
1

Это может помочь: Reactive Extensions (Rx) + MVVM = ?

+0

Я обнаружил, что полезно на самом деле, но я до сих пор пытаются понять, как точно для реализации выборки HOL с помощью словаря веб-сервисов в режиме MVVM. – Tony

1

Самый простой способ сделать образец клавиатуры будет двухсторонним привязать текст к свойству ViewModel. Затем текстовый установщик мог записать частному Subject, чтобы остаток вашего кода использовался в качестве основы для IObservable<string>. Оттуда вы можете заполнить образец HOL.

Движения мышки, как правило, считаются слишком «видными», чтобы помещать в ViewModel, но если логика, которая сошла с него, была достаточно сложной, вы могли бы выполнить ее ICommand или, возможно, поместить логику в поведение. Если были в ICommand, вы могли бы иметь команду есть WhenExecutedIObservable свойство, которое вы могли бы забрать в вашем ViewModel.`

+0

Мне бы очень хотелось увидеть более полные примеры в блогах. – Tony

Смежные вопросы