C# 更改displaymember的值时图表未更新
我有一张现代拼图绑在一个可观察的集合上 如果我更改了某个项目的名称,则该项目不会更新,但如果我更改了on item的值,则该项目将正确更新(添加/删除工作正常) 图表XAML:C# 更改displaymember的值时图表未更新,c#,wpf,binding,charts,modern-ui,C#,Wpf,Binding,Charts,Modern Ui,我有一张现代拼图绑在一个可观察的集合上 如果我更改了某个项目的名称,则该项目不会更新,但如果我更改了on item的值,则该项目将正确更新(添加/删除工作正常) 图表XAML: <chart:PieChart Grid.RowSpan="2" Style="{StaticResource MinimalChartStyle}" ChartTitle="Minimal Pie Chart" ChartSubTitle="Chart with fixed width a
<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=(十进制)CategoryExpenseLimit};
context.TransactionCategories.Add(category.TheCategory);
SaveChanges();
var obs=Application.Current.Resources[“CategoryObs”]作为可观测集合;
新增(新类别视图模型(类别));
编辑项的代码:(从数据库中检索并更新它,然后也更新可观察集合)
var category=context.TransactionCategories.Where(i=>i.CategoryId==this.CategoryId).First();
var tCategory=new TransactionCategoryModel(){TheCategory=category};
t category.TheCategory.CategoryId=(int)CategoryId;
t category.TheCategory.CategoryName=CategoryName;
tCategory.TheCategory.CategoryExpenseLimit=(十进制)CategoryExpenseLimit;
SaveChanges();
var obs=Application.Current.Resources[“CategoryObs”]作为可观测集合;
var x=obs.Where(i=>i.CategoryId==this.CategoryId).FirstOrDefault();
CategoryViewModel cvm=新的CategoryViewModel(tCategory);
x=cvm;
用这个我编辑一个项目。问题是,如果我编辑它并更改名称,则图表不会更新displaymember,但如果我同时更改expenselimit(这是图表的valuemember),则图表将正确更新。
名称不更新的事实仅在图表中发生。我在另一个视图中创建了一个datagrid,并绑定了Observablecollection,即使只更改了名称,数据网格也会正确更新
在图表的ViewModel中:
private ObservableCollection<CategoryViewModel> cat;
public ObservableCollection<CategoryViewModel> Cat
{
get { return cat; }
set
{
cat = value;
OnPropertyChanged("Cat");
}
}
private observedcollection cat;
公众观察收集猫
{
获取{return cat;}
设置
{
cat=数值;
不动产变更(“Cat”);
}
}
在构造器中:
if (cat == null)
cat = new ObservableCollection<CategoryViewModel>();
cat = Application.Current.Resources["CategoryObs"] as ObservableCollection<CategoryViewModel>;
if(cat==null)
cat=新的可观测集合();
cat=应用程序.Current.Resources[“CategoryObs”]作为可观察集合;
当我启动应用程序时:检索值
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);
}
private void GetCategories()
{
列表类别=新列表();
使用(var context=new Ents())
{
foreach(context.TransactionCategories中的var项)
{
TransactionCategoryModel tcm=new TransactionCategoryModel(){TheCategory=item};
添加(新类别视图模型(tcm));
}
}
ObservableCollection类别=新的ObservableCollection(类别);
Application.Current.Resources.Add(“CategoryObs”,Categories);
}
..编辑并更改名称图表不会更新
显示成员
两件事,observateCollection
主要是在列表中添加或删除项目时发出的信号。它无助于绑定或处理已编辑的项目
其次,对于要注意的单个项目的任何变化,它所绑定的属性需要发出其变化的信号。当它所驻留的类实现了INotifyPropertyChange
并使用其名称调用OnPropertyChanged
方法时,就会发出该信号
看看你的代码,你在学习我明白了,代码
public ObservableCollection<CategoryViewModel> Cat {
get { return cat; }
set { cat = value; OnPropertyChanged("Cat"); }}
公共可观测收集目录{
获取{return cat;}
设置{cat=value;OnPropertyChanged(“cat”);}
仅当分配了新的可观察集合时发出信号。现在,这在某些情况下可能很有用,例如在列表中交换和交换(我这样做是为了更改组合框下拉选择),但在您的情况下,这是一个对图表有用且需要的小技巧,但图表并不关心您是否有一个可观察集合
。因为你必须有目的地订阅observateCollection
事件才能做任何事情。坦率地说,你可以也应该使用列表来代替
图表不更新displaymember
类CategoryViewModel
上的属性CategoryName
是否调用PropertyChange,因为CategoryViewModel
实现了INotifyPropertyChanged
注意…即使是这样,图表工具也可能不会订阅更改通知,因为它是一个报告工具,不是这样设计的。如果是这种情况,您可能需要将整个类别视图模型
实例移入移出(将其删除,然后重新添加),以使报表图表控件显示名称的更改。有人提出建议吗?我尝试过删除和添加该项,但由于我正在删除和添加该项,因此会移动“Pie”。我正在使用collectionview,因为我想在以后添加过滤,并创建了一个刷新按钮。将其标记为答案,因为这将是一个解决方案。@Cristian每个控件都是不同的,并且您具有整体架构,因此它必须缺少一些内容。很高兴你能这么做。
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);
}
public ObservableCollection<CategoryViewModel> Cat {
get { return cat; }
set { cat = value; OnPropertyChanged("Cat"); }}