12 wpf system.reactive caliburn.micro observer-pattern
我在我的WPF应用程序中使用Caliburn.Micro的.NET(Rx)的Reactive扩展.我正在尝试移植我的WPF应用程序以使用MVVM架构,我需要监视TextBox控件的Text属性中的更改.
如果Text属性的最后一次更改超过3秒前,我需要调用服务的LoadUser方法.
将逻辑从我的旧解决方案移植到具有MVVM架构的新解决方案.
XAML:
<TextBox Name="Nick"
Grid.Row="0"
FontSize="14"
Margin="2,2,2,2"
HorizontalAlignment="Stretch"
TextChanged="Nick_TextChanged" />
Run Code Online (Sandbox Code Playgroud)
在代码背后我有这个:
...
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){...}
Run Code Online (Sandbox Code Playgroud)
我想在我的视图模型类中使用Observable.FromEvent.像这样的东西
视图:
<TextBox Name="Nick"
Grid.Row="0"
FontSize="14"
Margin="2,2,2,2"
HorizontalAlignment="Stretch"
Micro:Message.Attach="[TextChanged]=[Action TextChanged()]"/>
Run Code Online (Sandbox Code Playgroud)
查看型号:
[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()
{
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是Observable.FromEvent使用TextBox控件,我不知道如何从我的ViewModel类访问此控件.
我可以绑定到TextBox的Text属性,或者我可以将命令绑定到TextBox控件的某个事件,但此方法使用View中的对象.
谢谢你的想法.
Bry*_*son 25
将Nick属性添加到ViewModel并实现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);
Run Code Online (Sandbox Code Playgroud)
然后你的XAML会是这样的
<TextBox Name="Nick"
Grid.Row="0"
FontSize="14"
Margin="2,2,2,2"
HorizontalAlignment="Stretch"
Text="{Binding Nick, UpdateSourceTrigger=PropertyChanged}" />
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8152 次 |
| 最近记录: |