【问题标题】:Computed Properties in PrismPrism 中的计算属性
【发布时间】:2023-03-04 04:08:01
【问题描述】:

在 Prism MVVM 框架中处理计算属性的最佳方法是什么?我在虚拟机上有一个Xamarin.Forms 应用程序,它具有以下属性:

private string _title;
public string Title
{
    get { return _title; }
    set
    {
        SetProperty(ref _title, value);
        OnPropertyChanged(() => Message);
    }
}

private string _name = "John";
public string Name
{
    get { return _name; }
    set
    {
        SetProperty(ref _name, value);
        OnPropertyChanged(() => Message);
    }
}

public string Message
{
    get { return String.Format("{0},{1}", Name, Title); }
}

代码运行良好。但是,Prism 库在 OnPropertyChanged 语句中警告我使用 RaisePropertyChanged,这将避免使用魔术字符串,并且带有表达式的 OnPropertyChanged 效率较低。

是否有其他方法可以在名称或标题更改时通知视图重新读取“消息”?

这让我想到,也许 Prism 有一种设置方法,这样“名称”和“标题”就不必知道 Message 以更新 Message。如果可能的话,这将是可取的。执行计算属性的“棱镜”方式是什么?我在他们的 Xamarin.Forms 文档中找不到任何示例。

【问题讨论】:

  • SetProperty(ref _name, value); 行以及所有视图模型都继承自 BindableBaseINotifyPropertyChanged 的实现)的事实已经在您更新这些属性时更新了 UI。您永远不必显式调用RaisePropertyChangedOnPropertyChanged。因此,您需要让您的消息像 Name 一样成为属性。

标签: mvvm xamarin.forms prism


【解决方案1】:

如果您尝试以更难的方式执行此操作,您可以执行以下操作:

public class FooViewModel : BindableBase
{
    private string _foo;
    public string Foo
    {
        get => _foo;
        set => SetProperty(ref _foo, value, () => RaisePropertyChanged(nameof(FooBar)));
    }

    public string FooBar => $"{Foo} Bar";
}

如果你想让你的生活更轻松一点,安装PropertyChanged.Fody,你就可以拥有一个像下面这样的 ViewModel:

public class SomeViewModel : BindableBase
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string FullName => $"{FirstName} {LastName}";
}

Fody 应该为您提供一个空的 Weavers.xml,您只需将其更新为如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Weavers>
    <PropertyChanged EventInvokerNames="RaisePropertyChanged" />
</Weavers>

【讨论】:

  • 其实,刚刚上网搜索了一下,看起来 Fody 确实有效。也感谢第一个代码示例。
  • 没问题。是的,它确实有效,我现在在所有项目中都使用它。
猜你喜欢
  • 2020-12-01
  • 2020-02-05
  • 2014-01-23
  • 2017-08-23
  • 2012-03-27
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 2020-05-17
相关资源
最近更新 更多