更改 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
实例进出(将其删除然后重新添加)以使报告图表控件显示更改在名字里。
我有一个绑定到 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
实例进出(将其删除然后重新添加)以使报告图表控件显示更改在名字里。