当item属性发生更改时,dataGrid不会更新

时间:2016-12-07 18:00:51

标签: c# wpf datagrid

所以我用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; }

1 个答案:

答案 0 :(得分:2)

根据您的示例,如果您在集合中动态添加或删除计划,那么应该起作用。

但是如果你想从UI更新给定的时间表,如:

selectedItem.Name = "Testing";

您想要的是更新Shedule项目本身,而不是更新Schedule。

换句话说,如果您希望在视图中编辑它,则需要一个viewModel作为Schedule。你还需要为Shedule提供一个数据模板,让WPF知道如何渲染Shedule。

希望它有所帮助。