INotifyPropertyChanged для индексированных свойств - PullRequest
0 голосов
/ 31 октября 2018

Итак, у меня есть следующий класс:

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", и поле "some_other_field" в Data, и я не нашел способа использовать PropertyChanged, который заставит его обновить только поле, которое было обновлено.

Я пробовал с "Item[" + field + "]", "[" + field + "]", field, но не повезло. Это возможно / поддерживается или я что-то не так делаю?

1 Ответ

0 голосов
/ 31 октября 2018

Я думаю, что это невозможно, по крайней мере, для WPF и dot NET Framework.

Предложение / обходной путь: что если мы добавим некоторые свойства только для чтения в модель представления? Пример:

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>

На самом деле не отвечает конкретно на ваш вопрос, но он дает возможность контролировать, сколько обновляется представление.

...