2017-06-20 124 views
0

什么是棱镜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); } 
} 

代码工作就好了。然而,棱镜库警告我在OnPropertyChanged语句中使用RaisePropertyChanged这将避免使用魔法字符串和OnPropertyChanged与表达效率较低。

有一些其他方法来通知视图重读“消息”每当姓名或名称的改变?

它让我想也许棱镜有办法做一些事情,让“名”和“标题”不必知道的消息,以便进行更新的消息。如果可能,这将是优选的。计算属性的“棱镜”方式是什么?我在Xamarin.Forms文档中找不到任何示例。

+0

线'的SetProperty(参见_name,值);'而事实上,所有视图模型从'BindableBase'(INotifyPropertyChanged'的'实现)继承已更新,只要你更新这些属性的UI。你永远不必显式调用'RaisePropertyChanged'或'OnPropertyChanged'。因此,您需要将您的消息设置为与Name一样的属性。 – ethane

回答

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,你可以只是有一个视图模型像下面这样:

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> 
+0

Fody与Xamarin.Forms一起工作吗? – Sean

+0

其实,只是做了一个互联网搜索,它看起来像Fody确实工作。感谢第一个代码示例。 – Sean

+1

没问题。是的,它确实有用,现在我用在我所有的项目中。 –