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

标签 c# mvvm windows-community-toolkit

我们如何使用 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 公共(public)属性的创建。 author 呢?

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

最佳答案

这里有多个场景:

整个 Person 对象被替换

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

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;
}

此更改将反射(reflect)在 UI 中:

Author = anotherPerson;

而这个不会:

Author.FirstName = "James";

个人属性得到改变

如果您打算更改个人的个人属性,但保持实例不变,则需要使用 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();
}

此更改将反射(reflect)在 UI 中:

Author.FirstName = "James";

而这个不会:

Author = anotherPerson;

或两者兼而有之

或者两者兼而有之,让 UI 反射(reflect)任何更改,无论是更改单个属性还是整个对象实例。

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

    [ObservableProperty]
    string lastName;
}

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

   [ObservableProperty]
   decimal price;

   [ObservableProperty]
   Person author;
}

任何这些更改都将反射(reflect)在 UI 中:

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

关于c# - 使用 CommunityToolkit.Mvvm 处理可观察对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72552051/

相关文章:

c# - 有效地从大型列表中删除重复项?

c# - ReSharper 类型成员布局排序和 [DataMember] 属性

c# - MVVM 应用程序中用户配置数据的实用管理

c# - 图像未在 Windows 通用应用程序的 MarkdownTextBlock 控件中呈现

c# - 带有源代码的 UWP 社区工具包

c# - System.InvalidCastException 解析 FluentCommandLineParser 参数

c# - 解析c#类文件获取属性和方法

javascript - MVVM If 语句

javascript - 剑道用户界面 : Unable to bind data to list view using MVVM

vb.net - 是否可以让 WebView 控件读取本地 html 文件?