Prism 中的计算属性

Sea*_*ean 1 prism mvvm xamarin.forms

在 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); }
}
Run Code Online (Sandbox Code Playgroud)

该代码工作得很好。然而,Prism 库警告我OnPropertyChanged要使用的语句RaisePropertyChanged,这将避免使用魔术字符串,并且使用表达式的 OnPropertyChanged 效率较低。

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

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

Dan*_* S. 6

如果您尝试以更困难的方式做到这一点,您可以执行以下操作:

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";
}
Run Code Online (Sandbox Code Playgroud)

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

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

    public string LastName { get; set; }

    public string FullName => $"{FirstName} {LastName}";
}
Run Code Online (Sandbox Code Playgroud)

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

<?xml version="1.0" encoding="utf-8"?>
<Weavers>
    <PropertyChanged EventInvokerNames="RaisePropertyChanged" />
</Weavers>
Run Code Online (Sandbox Code Playgroud)