【发布时间】:2017-02-07 03:58:08
【问题描述】:
我有一个选定的树视图项目,它有一个 ObservableCollection 模型(员工),当从树中选择项目/员工时,我正在显示员工详细信息,如 id(textblock)、name(textblock) 和促销详细信息(在 DataGrid 中,它是另一个名为“PromotionHistory”的模型的可观察集合),它正确显示了详细信息。
<TreeView x:Name="EmployeesDataTree" ItemsSource="{Binding Employees}"/>
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding ElementName=EmployeesDataTree, Path=SelectedItem.EmployeePromotionDetails}">
<DataGrid.Columns>
<DataGridTextColumn Header="Employee Promotion Id" Binding="{Binding Name}" />
<DataGridTextColumn Header="Employee NewTitle" Binding="{Binding NewTitle}" />
<DataGridTextColumn Header="Employee Location " Binding="{Binding Location}" />
....
</DataGrid.Columns>
</DataGrid>
当我通过代码更改视图模型中 PromotionHistory 数据网格中的位置名称单元格值时单击按钮(“UpdateLocation”),尽管我的 observablecollection 项目详细信息已成功更新,但更改并未反映回 UI。
foreach (var item in (SelectedEmployeeItem as EmployeeModel).EmployeePromotionDetails)
{
// condition which hits service and verify if the location name is up to date by searching with id and updates.
if(condition)
{
item.Name = "New Location";
}
}
在对该站点进行一些研究后,我发现我的问题是 ObservableCollection 本身(例如添加/删除项目)没有改变,而只是该集合内的项目。但我无法通过更改更新 ui/view。
【问题讨论】:
-
项目需要实现INotifyPropertyChanged。你的研究应该证实了这个事实。你自然不能忍受分享
item.Name的setter 代码(毕竟是这样),但它不会引发PropertyChanged,不是吗?出错的方法很少,而且几乎是所有方法。 -
尝试添加
Mode=TwoWay,以便在源更改时更新您的视图。例如。Binding="{Binding Name, Mode=TwoWay}"和NewTitle以及Location相同。