簡體   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