繁体   English   中英

使用 CommunityToolkit.Mvvm 处理可观察对象属性

[英]Handling observable object properties with CommunityToolkit.Mvvm

我们如何使用CommunityToolkit.Mvvm处理本身就是对象的属性?

我知道我可以简单地使用具有简单属性的[ObservableProperty]属性,例如stringint等数据类型。

我们如何处理POCO对象且需要可观察的属性?

这是一个例子:

public partial class MyViewModel : ObservableObject
{
   [ObservableProperty]
   string title;

   [ObservableProperty]
   decimal price;

   Person author; // How do we handle this property that is a Person object?
}

我了解CommunityToolkit.Mvvm中的源生成器将自动处理TitlePrice公共属性的创建。 author呢?

我们是否使用[ObservableProperty]属性来使复杂的属性可观察,例如上面示例中的author属性是一个Person对象?

这里有多个场景:

整个 Person 对象被替换

如果您只替换整个 Person 对象并且不更改其各个属性(您可能会从列表中选择不同的人),那么您只需要使用ObservablePropertyAttribute装饰author字段。

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public partial class MyViewModel : ObservableObject
{
   [ObservableProperty]
   string title;

   [ObservableProperty]
   decimal price;

   [ObservableProperty]
   Person author;
}

此更改将反映在 UI 中:

Author = anotherPerson;

这个不会:

Author.FirstName = "James";

个人 Person 属性已更改

如果您打算更改 Person 的各个属性,但保持实例相同,则需要使用ObservablePropertyAttribute装饰Person对象的各个属性。

public class Person : ObservableObject
{
    [ObservableProperty]
    string firstName;

    [ObservableProperty]
    string lastName;
}

public partial class MyViewModel : ObservableObject
{
   [ObservableProperty]
   string title;

   [ObservableProperty]
   decimal price;

   public Person Author { get; } = new Person();
}

此更改将反映在 UI 中:

Author.FirstName = "James";

这个不会:

Author = anotherPerson;

或两者

或者两者都做,让 UI 反映任何更改,无论是更改单个属性还是整个对象实例。

public class Person : ObservableObject
{
    [ObservableProperty]
    string firstName;

    [ObservableProperty]
    string lastName;
}

public partial class MyViewModel : ObservableObject
{  
   [ObservableProperty]
   string title;

   [ObservableProperty]
   decimal price;

   [ObservableProperty]
   Person author;
}

这些更改中的任何一个都将反映在 UI 中:

Author = anotherPerson;
Author.FirstName = "James";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM