我有一个与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);
}
答案 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
实例进出(删除它然后重新添加)以使报告图表控件显示名称的更改