我希望这样的事情能奏效:

[ObservableProperty]
[NotifyPropertyChangedFor(nameof(Count))]
public ObservableCollection<TODO> todos = new();

public int Count => Todos.Count;

虽然Count在ViewModel层进行了更新,但用户界面似乎并未更新.我还try 使用由MVVM社区工具包源代码生成器生成的OnTodosChanged方法,但这不会被激发.请注意,我期望UI在调用TodosAdd、ETC方法时进行更新.

  1. 为什么[NotifyPropertyChangedFor(nameof(Count))]不更新Adding上的用户界面到Todos集合?如果这不是做这件事的方法,那么什么才是呢?
  2. 为什么OnTodosChanged没有在Todos集合的元素的Add定义上被调用?
  3. 对于像Todos[0].IsCompleted = true这样的操作,用户界面会更新吗?若否,如何处理?

我决定在这里发布的原因是,我找不到任何相关的文档(这相当令人沮丧,因为我认为这可能是常见的操作),也没有任何教程视频/示例应用程序,这让我质疑这是不是正确的方法.感谢您的帮助!-谢谢:^)

推荐答案

你要用这MVVM Source Generators美元做什么:

[ObservableProperty]
[NotifyPropertyChangedFor(nameof(Count))]
public ObservableCollection<TODO> todos = new();

public int Count => Todos.Count;

相当于写下以下内容:

private ObservableCollection<TODO> _todos = new();
public ObservableCollection<TODO> Todos
{
    get => _todos;
    set
    {
        if(_todos == value) return;
        _todos = value;
        OnPropertyChanged(nameof(Todos));
        OnPropertyChanged(nameof(Count));
    }
}

public int Count => Todos.Count;

PropertyChanged通知仅在Todos property改变时发生,但notObservableCollection<TODOS>content改变时发生.向集合中添加元素并不更改属性.

如果要在将项添加到Todos集合时通知对Count属性的更改,则需要订阅集合的CollectionChanged事件:

[ObservableProperty]
public ObservableCollection<TODO> todos;

public int Count => Todos.Count;

public YouClassConstructor()
{
    Todos = new();
    Todos.CollectionChanged += (s,e) => OnPropertyChanged(nameof(Count));
}

如果您想更深入地了解这个主题,我还写了一个关于MVVM源代码生成器的小文章blog series.

Csharp相关问答推荐

我如何才能获得被嘲笑班级的私有成员?

无法使用ternal- .net修复可空警告

注册通用工厂的C# Dep注入

如何从HttpContext获取请求正文

使页面内容居中

模型绑定RazorPage表单

Blazor服务器端的身份验证角色

MongoDB.NET-将数据绑定到模型类,但无法读取整数值

如何测量在使用UTF8而不是C#中的UTF16编码字符串时内存使用量的增长

实体框架核心中的ComplexType和OwnsOne有什么不同?

在具有不同属性名称的两个类之间创建关系

用于管理System.Text.Json中的多态反序列化的自定义TypeInfoResolver

使用System.Text.Json进行序列化时发生StackOverflow异常

如何在.NET AOT中为所有枚举启用JsonStringEnumConverter

泛型参数在.NET 8 AOT中没有匹配的批注

将C#类导入到PowerShell

如何使用.NET 8.0中新的CompositeFormat类?

在C#中通过Matheval使用自定义公式

SqlException:无法打开数据库.升级到Dotnet 8后-数据库兼容性版本-非EFCore兼容性级别

如何对正方形格线进行对角分组