索引属性的 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>
并没有真正具体地回答您的问题,但它确实提供了一种方法来控制刷新多少视图。
所以我有一个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>
并没有真正具体地回答您的问题,但它确实提供了一种方法来控制刷新多少视图。