我有一个绑定到ObservableCollection的DataGrid,我确信我用来更新该集合中的项的方式不是正确的。我在刷新DataGrid时遇到了一些问题。如果我直接修改一个项目,DataGrid不会刷新,直到我单击另一个单元格。我可以看到在"Details“和"_Detail”中点击了NotifyPropertyChanged,但UI就是不刷新。在尝试了很多方法之后,我找到了一个变通方法:删除前面的项目,然后添加新的项目。问题是我不想用正确的方式去做。So...which one是什么?
C#
public class AsientoDetallesViewModel : ViewModelBase, IInteractionRequestAware, INotifyPropertyChanged
{
private ObservableCollection<Details> details;
public ObservableCollection<Details> Details
{
get => details;
set
{
SetProperty(ref details, value, nameof(Details));
NotifyPropertyChanged(nameof(Details));
}
}
private Detail _detail;
public Detail _Detail
{
get => _detail;
set
{
SetProperty(ref _detail, value, nameof(_Detail));
NotifyPropertyChanged(nameof(_Detail));
}
}
private void UpdateRow()
{
var itemUpdated = _Detail;
itemUpdated.Account.Name = "some name";
itemUpdated.Account.Name2 = "another name";
//the workaround
Detalles.Remove(itemUpdated);
Detalles.Add(itemUpdated);
}
}
XAML
<DataGrid ItemsSource="{Binding Details, Mode=TwoWay}"
SelectedItem="{Binding _Details, Mode=TwoWay}"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Binding Path=Account.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center" Margin="0, 3, 0, 0" ></TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Account.Name2, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="0, 3, 0, 0"></TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
发布于 2019-08-05 14:27:40
正是从Detail
类的Account
属性返回的对象必须实现INotifyPropertyChanged
接口,并引发绑定到Name
和Name2
属性的TextBlocks
的更改通知才能刷新。
AsientoDetallesViewModel
是否实现INotifyPropertyChanged
并不重要,因为您没有绑定到该类的属性。
https://stackoverflow.com/questions/57360518
复制相似问题