索引属性的 INotifyPropertyChanged

INotifyPropertyChanged for indexed properties

所以我有一个class如下:

public class Data : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public object this[string field]
    {
        get => // gets the value
        set
        {
            // sets the value
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Item[]"));
        }
    }
}

在我看来:

<DataGrid
    AutoGenerateColumns="False"
    ItemsSource="{Binding Rows}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="[some_field]" Binding="{Binding Path=[some_field]}" />
        <DataGridTextColumn Header="[some_other_field]" Binding="{Binding Path=[some_other_field]}" />
    </DataGrid.Columns>
</DataGrid>

这很好用,但是当 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Item[]")); 发生时,DataGrid 将同时获取字段 "some_field"Data 中的字段 "some_other_field" 而我没有' 找到了一种使用 PropertyChanged 的方法,使其仅刷新已更新的字段。

我试过 "Item[" + field + "]""[" + field + "]"field,但没有成功。这是 possible/supported 还是我做错了什么?

我认为这是不可能的,至少对于 WPF 和.NET Framework 而言。

Suggestion/workaround:如果我们向视图模型添加一些只读属性会怎么样? 示例:

public class Data : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public object this[string field]
    {
        get => // gets the value
        set
        {
            // sets the value
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(field));
        }
    }

    public object some_field => this[nameof(some_field)];
    public object some_other_field=> this[nameof(some_other_field)];
}

和 XAML:

<DataGrid
    AutoGenerateColumns="False"
    ItemsSource="{Binding Rows}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="[some_field]" Binding="{Binding Path=some_field}" />
        <DataGridTextColumn Header="[some_other_field]" Binding="{Binding Path=some_other_field}" />
    </DataGrid.Columns>
</DataGrid>

并没有真正具体地回答您的问题,但它确实提供了一种方法来控制刷新多少视图。