Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更改displaymember的值时图表未更新_C#_Wpf_Binding_Charts_Modern Ui - Fatal编程技术网

C# 更改displaymember的值时图表未更新

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

我有一张现代拼图绑在一个可观察的集合上

如果我更改了某个项目的名称,则该项目不会更新,但如果我更改了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=(十进制)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"); }}