XAML 在.NET MAUI中刷新绑定

qgelzfjb  于 2023-05-21  发布在  .NET
关注(0)|答案(2)|浏览(352)

我有一个场景,使用INotifyPropertyChanged接口从ViewModel更新View是不合适的。
相反,我想显式地刷新一些绑定。
在WPF中,通过从控件获取BindingExpression并调用BindingExpression.UpdateTarget()(参见How to force a WPF binding to refresh?)似乎可以做到这一点。
在MAUI有可能发生类似的事情吗?BindingExpression似乎并不存在...

背景

我正在显示一个项目列表,每个项目都有一个CreatedAt时间戳。例如,在UI中,我想显示为“7分钟前”。因此,我创建了一个值转换器,将DateTime转换为字符串。当然,显示的字符串应该随着时间的推移而更新。
恕我直言,在这种情况下,更新UI中的文本应该是视图的问题。我不想在我的ViewModels中有一个间隔计时器。我更喜欢在我的视图中有一个间隔计时器(在后面的代码中),它只刷新当前可见的那些项的绑定。

col17t5w

col17t5w1#

“恕我直言,在这种情况下,更新UI中的文本应该是视图的问题。我不想在我的ViewModels中有一个间隔计时器。我更喜欢在我的视图中(在后面的代码中)有一个间隔计时器,它只刷新当前可见的那些项的绑定。
我想指出一些关于MVVM的重要内容。
当遵循MVVM体系结构时,ViewModel不应该知道关于视图的任何信息。但是,您的View始终可以访问ViewModel。
您可以随时从ViewModel调用方法。作为对事件的响应、接收到的消息或其他东西。
你的View应该已经包含了对ViewModel的引用,所以通过创建一个计时器,并调用一个方法来更新你的数据,你将不会违反任何MVVM原则。
(If我没有说服你,告诉我继续……)

j2qf4p5b

j2qf4p5b2#

不幸的是,Maui缺乏任何访问绑定表达式的方法。
一种解决方案是创建视图属性来执行您想要的操作,并在计时器上触发属性更改:

<Label Text="{Binding RelativeTime1, Source={RelativeSource Self}}" />

In view的代码隐藏:

MyViewModel VM => BindingContext as MyViewModel;

public RelativeTime1 => AsRelativeTime(VM.Time1);

// Each timer tick
public void Elapsed()
{
   OnPropertyChanged(nameof(RelativeTime1));
}

相关问题