我有一个选定的树视图项目,其中包含一个ObservableCollection模型(员工),当从树中选择一个项目/员工时,我显示员工详细信息,如id(文本块),名称(文本块)和促销详细信息(在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>
单击按钮(“UpdateLocation”)时,如果我通过代码更改了我的viewmodel中的PromotionHistory数据网格中的位置名称单元格值,则更改不会反映回UI,但我的observablecollection项目详细信息已成功更新。
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本身(如添加/删除项目)没有改变,只有INSIDE那个集合的项目。但我无法通过更改来更新ui / view。
答案 0 :(得分:1)
如果您的item
类型为PromotionHistory
,则您的班级需要实施以下内容:
public class PromotionHistory : INotifyPropertyChanged
{
private string _name;
public string Name {
get { return _name; }
set {
_name = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
PropertyChanged
事件正在更新您的用户界面。 ObservableCollection仅在通过CollectionChanged
事件添加或删除项目时具有效果,该事件与已更改的项目属性无关。
答案 1 :(得分:0)
每个项目是否实现了INotifyPropertyChanged?如果不是那就是你的问题。需要通知ObservableCollection更改,INotifyPropertyChanged接口执行此操作。