具有可观察集合项详细信息更改的模型,而不更新WPF MVVM中的DataGrid视图

时间:2016-09-29 01:19:11

标签: c# wpf xaml mvvm datagrid

我有一个选定的树视图项目,其中包含一个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。

2 个答案:

答案 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接口执行此操作。