【问题标题】:dataGrid doesn't update when item property has changed项目属性更改时 dataGrid 不更新
【发布时间】:2016-12-07 18:00:50
【问题描述】:

所以我用 TextBoxes/ListBoxes 等设置了几乎相同的东西,但它似乎不适用于 dataGrid..

所以我有一个包含 dataGrid 的视图索引。

我创建了一个 IndexModel 类,如下所示:

public class IndexModel : INotifyPropertyChanged
{
    private ObservableCollection<Schedule> _schedules;

    public IndexModel(ObservableCollection<Schedule> schedules)
    {
        _schedules = schedules;
    }

    public ObservableCollection<Schedule> Schedules
    {
        get { return _schedules; }
        set
        {
            _schedules = value;
            OnPropertyChanged();
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

然后在我的 IndexView 中创建 IndexModel。

    private ObservableCollection<Schedule> _schedules;

    public Index(MainController controller)
    {
        _controller = controller;
        InitializeComponent();
        _schedules = controller.DatabaseController.GetSchedules() as ObservableCollection<Schedule>;

        DataContext = new IndexModel(_schedules);
        Log.Info($"UI Component {componentName} loaded succesfully",componentName, Source);
    }

我创建 DataContext 并在 XAML 中绑定它

ItemsSource="{Binding Path=Schedules, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" 

我什至创造了一个简单的虚空。

Schedule selectedItem = (Schedule) dataGrid.SelectedItem;
selectedItem.Name = "Testing";

它更新了 ObservableCollection 但 dataGrid 没有更新...

我查看了stackoverflow之类的所有答案,但仍然无法解决我的问题..

public partial class Schedule
{
    public int Id { get; set; }

    [Required]
    [StringLength(50)]
    public string Name { get; set; }

    public DateTime DateFrom { get; set; }

    public DateTime DateTo { get; set; }

    public virtual User User { get; set; }

    [StringLength(256)]
    public string Comment { get; set; }

    [StringLength(256)]
    public string Description { get; set; }

    [Required]
    public Priorities Priority { get; set; }

    public virtual UpdaterObject Object { get; set; }

    public virtual ICollection<ScheduleAction> ScheduleAction { get; set; }

【问题讨论】:

    标签: c# wpf datagrid


    【解决方案1】:

    ObservableCollection 在您向其中添加或删除项目时引发通知:其存在的原因是实现 INotifyCollectionChanged。它还会在其自己的 属性更改时发出通知(它也实现了INotifyPropertyChanged,因此您可以绑定到obcoll.Count)。

    你没有做这些;事实上,ObservableCollection 根本无法知道您已经做了什么。它会如何发现?谁会告诉它?

    要让集合知道其中一个项目的属性已更改,该项目必须实现INotifyPropertyChanged,并且集合必须处理通知。好吧,一旦项目这样做了,集合就根本不需要参与项目的通知。

    更改通知的规则是通知由其个人状态已更改的对象引发。如果成员或包含的项目发生更改,则不涉及父/容器。由于上面给出的原因,如果它试图这样做是没有任何意义的。

    所以:Schedule 需要实现 INotifyPropertyChanged 并在其 Name 属性值更改时引发 PropertyChanged

    上面的规则意味着,如果你有一个绑定要触及的类,那么除非它是不可变的(例如String),否则它需要实现INotifyPropertyChanged

    【讨论】:

    • 啊.. 有道理。我更改了 INotifyProperty 而不是 INotifyCollectionChanged。我将尝试使用 CollectionChanged 并尽快提供更新
    • @Wkjjjj 什么?你在说什么?!基本上没有任何理由实施INotifyCollectionChanged。你是说Schedule 确实实现了INotifyPropertyChanged?如果是这样,那么问题根本不是我想的那样。
    • @Wkjjjj 可以分享Schedule的源码吗?
    • 我更新了我的问题。我想我应该在我的 Schedule 类而不是我的模型中实现 INotifyProperty 更改。我似乎明白我现在该怎么办了。虽然如果我的 Schedule 模型来自 EntityFramework 有什么区别吗?这是代码优先的方法。
    • @Wkjjjj 去吧。当 Entity Framework 为您生成类时,它会自动实现 INotifyPropertyChanged,所以我不认为这是一个问题。
    【解决方案2】:

    根据您的示例,如果您在集合中动态添加或删除计划,则应该可行。

    但是,如果您想从 UI 更新给定的计划,例如:

    selectedItem.Name = "Testing";
    

    你想要的是更新一个 Shedule 项目本身,而不是 Schedule 的集合。

    换句话说,如果您希望在视图中对其进行编辑,您需要一个用于 Schedule 的 viewModel。您还需要为 Shedule 提供一个数据模板,让 WPF 知道它应该如何呈现一个 Shedule。

    希望对你有帮助。

    【讨论】:

    • 所以我听从了你的建议,只是制作了我的财产并模拟了其中的数据。然后我以这种方式编辑: Schedules.FirstOrDefault(x => x.ID == 1).Name == "Test";我编辑了绑定到 ItemSource 的项目(通过 100% 更新的调试集合检查)数据网格保持不变。
    • 您的 DataTemplate 是什么样的? wpftutorial.net/datatemplates.html
    猜你喜欢
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 2012-04-16
    相关资源
    最近更新 更多