【问题标题】:model with changes in observable collection item details not updating DataGrid View in WPF MVVM具有可观察集合项详细信息更改的模型未更新 WPF MVVM 中的 DataGrid 视图
【发布时间】: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 相同。

标签: c# wpf xaml mvvm datagrid


【解决方案1】:

如果您的 itemPromotionHistory 类的类型,您的类需要实现以下内容:

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 事件正在更新您的 UI。 ObservableCollection 仅对通过CollectionChanged 事件添加或删除项目有影响,该事件与更改的项目属性无关。

【讨论】:

    【解决方案2】:

    每个项目是否都实现了 INotifyPropertyChanged?如果不是那是你的问题。 ObservableCollection 需要被通知更改,而 INotifyPropertyChanged 接口执行此操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-19
      • 1970-01-01
      • 2016-12-26
      • 2016-11-08
      相关资源
      最近更新 更多