更改 displaymember 的值时图表不更新

chart not updating when changing the value of displaymember

我有一个绑定到 ObservableCollection 的 Modernui Piechart。

如果我更改一个项目的名称,它不会更新,但如果我更改项目的值,那么它将正确更新(add/remove 工作正常)。

图表 XAML :

<chart:PieChart Grid.RowSpan="2"
    Style="{StaticResource MinimalChartStyle}"
    ChartTitle="Minimal Pie Chart"
    ChartSubTitle="Chart with fixed width and height"
     >
                <chart:PieChart.Series>
                    <chart:ChartSeries
            SeriesTitle="Categories"
            DisplayMember="CategoryName"
            ValueMember="CategoryExpenseLimit"
            ItemsSource="{Binding Path=Cat}" />
                </chart:PieChart.Series>
            </chart:PieChart>

我添加项目的代码:(这会在添加项目时正确更新图表)

TransactionCategoryModel category = new TransactionCategoryModel() { TheCategory = { CategoryName = CategoryName, CategoryExpenseLimit = (decimal)CategoryExpenseLimit }};

                        context.TransactionCategories.Add(category.TheCategory);
                        context.SaveChanges();
                        var obs = Application.Current.Resources["CategoryObs"] as ObservableCollection<CategoryViewModel>;
                        obs.Add(new CategoryViewModel(category));

编辑项目的代码:(从数据库中检索它并更新它,然后也更新可观察的集合)

                var category = context.TransactionCategories.Where(i => i.CategoryId == this.CategoryId).First();
                var tCategory = new TransactionCategoryModel() { TheCategory = category };

                    tCategory.TheCategory.CategoryId = (int)CategoryId;
                    tCategory.TheCategory.CategoryName = CategoryName;
                    tCategory.TheCategory.CategoryExpenseLimit = (decimal)CategoryExpenseLimit;
                    context.SaveChanges();
                    var obs = Application.Current.Resources["CategoryObs"] as ObservableCollection<CategoryViewModel>;
                    var x = obs.Where(i => i.CategoryId == this.CategoryId).FirstOrDefault();
                    CategoryViewModel cvm = new CategoryViewModel(tCategory);

                    x = cvm;

用这个我编辑了一个项目。问题是,如果我编辑它并更改名称,图表不会更新显示成员,但如果我还更改费用限制(这是图表的值成员),则图表将正确更新。 名称不更新的事实只发生在图表上。我在另一个视图中创建了一个数据网格并绑定了 Observablecollection,即使我只更改名称,数据网格也会正确更新。

在图表的 ViewModel 中:

 private ObservableCollection<CategoryViewModel> cat;
    public ObservableCollection<CategoryViewModel> Cat
    {
        get { return cat; }
        set
        {
            cat = value;
            OnPropertyChanged("Cat");
        }

    }

并且在构造函数中:

if (cat == null)
            cat = new ObservableCollection<CategoryViewModel>();
        cat = Application.Current.Resources["CategoryObs"] as ObservableCollection<CategoryViewModel>;

当我启动应用程序时:检索值

 private void GetCategories()
    {
        List<CategoryViewModel> categories = new List<CategoryViewModel>();

        using( var context = new Ents())
        {
            foreach(var item in context.TransactionCategories)
            {
                TransactionCategoryModel tcm = new TransactionCategoryModel() { TheCategory = item };
                categories.Add(new CategoryViewModel(tcm));
            }
        }
        ObservableCollection<CategoryViewModel> Categories = new ObservableCollection<CategoryViewModel>(categories);
        Application.Current.Resources.Add("CategoryObs", Categories);
    }

..edit it and change the name the chart does not update the displaymember

有两点,ObservableCollection 主要是在列表中添加或删除项目时发出信号。它无助于绑定或处理已编辑的项目。

其次,要注意单个项目的任何更改,它所绑定的 属性 需要 发信号 它的更改。当 class 它驻留在 上实现 INotifyPropertyChange 并且它调用一个 OnPropertyChanged 方法并使用其名称时,该信号就完成了。


所以看看你的代码,你正在学习我明白了,代码

public ObservableCollection<CategoryViewModel> Cat {
        get { return cat; }
        set { cat = value; OnPropertyChanged("Cat"); }}

仅在分配 new 可观察集合时发出信号。现在这在某些情况下可能会有帮助,例如交换进出列表(我这样做是为了改变组合框下拉选择)但在你的情况下它是一个对图表有用和需要的小马,但图表没有不在乎你有一个 ObservableCollection。因为必须有目的地订阅 ObservableCollection 事件才能做任何事情。坦率地说,您可以而且应该只使用 List<CategoryViewModel> 代替。

chart does not update the displaymember

class CategoryViewModel 上的 属性 CategoryName 是否因为 CategoryViewModel 实现了 INotifyPropertyChanged 而调用了 PropertyChange?

注意...即便如此,图表工具也可能不会订阅更改通知,因为它是一个报告工具,并不是这样设计的。如果是这种情况,您可能需要 wink 整个 CategoryViewModel 实例进出(将其删除然后重新添加)以使报告图表控件显示更改在名字里。