gpt4 book ai didi

wpf - WPF 中 .NET (Rx) 的响应式扩展 - MVVM

转载 作者:行者123 更新时间:2023-12-04 00:23:17 25 4
gpt4 key购买 nike

我在我的 WPF 应用程序中使用带有 Caliburn.Micro 的 NET (Rx) 响应式扩展。我正在尝试移植我的 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" />

后面的代码我有这个:
...

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){...}

我想在我的 View 模型类中使用 Observable.FromEvent 。像这样的东西

带有 MVVM 的 WPF

查看:
<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 类中访问该控件。

我可以绑定(bind)到 TextBox 的 Text 属性,也可以将命令绑定(bind)到 TextBox 控件的某个事件,但此方法使用 View 中的对象。

感谢您的想法。

最佳答案

添加 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);

然后你的 XAML 会是这样的
<TextBox Name="Nick" 
Grid.Row="0"
FontSize="14"
Margin="2,2,2,2"
HorizontalAlignment="Stretch"
Text="{Binding Nick, UpdateSourceTrigger=PropertyChanged}" />

关于wpf - WPF 中 .NET (Rx) 的响应式扩展 - MVVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4585066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com