更改displaymember

时间:2015-04-25 09:03:12

标签: c# wpf binding charts modern-ui

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

如果我更改了一个项目的名称,它没有更新,但是如果我更改了on item的值,那么它将被正确更新(添加/删除工作正常)。

图表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;

有了这个我编辑一个项目。问题是如果我编辑它并更改名称图表不更新显示成员,但如果我也更改了expenseselimit(这是图表的值成员),那么图表将正确更新。 名称不更新的事实仅发生在图表中。我在另一个视图中创建了一个datagrid,并且即使我只更改了名称,也可以正确绑定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);
    }

1 个答案:

答案 0 :(得分:0)

  

..编辑它并更改图表不更新的名称   displaymember

两件事,ObservableCollection主要是在项目列表中添加或删除项目时的信号。它不会帮助绑定或处理编辑的项目。

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

所以看着你的代码,你正在学习我得到的代码

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

仅在分配可观察集合时发出信号。现在这在某些情况下可能会有所帮助,例如换入和退出列表(我这样做是为了更改组合框下拉选项)但在你的情况下它是一个对图表有用的一招小马,但是图表并没有#39;关心你有一个ObservableCollection。因为必须有目的地订阅ObservableCollection事件才能做任何事情。坦率地说,你可以而且应该只使用List<CategoryViewModel>

  

图表不会更新显示成员

CategoryName上的属性CategoryViewModel是否会调用PropertyChange,因为CategoryViewModel实现了INotifyPropertyChanged

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