Wpf 自定义ObservableCollection属性的数据绑定问题

Wpf 自定义ObservableCollection属性的数据绑定问题,wpf,mvvm,binding,observablecollection,Wpf,Mvvm,Binding,Observablecollection,我正在制作一个小型的个人理财计划,使用“信封”作为预算方法。我这样做主要是为了学习WPF和MVVM。我遇到了一个无法数据绑定到我在自定义ObservableCollection中创建的自定义属性的问题,如图所示: public class ObservableEnvelopeCollection : ObservableCollection<Envelope> { public decimal Total { get {

我正在制作一个小型的个人理财计划,使用“信封”作为预算方法。我这样做主要是为了学习WPF和MVVM。我遇到了一个无法数据绑定到我在自定义ObservableCollection中创建的自定义属性的问题,如图所示:

public class ObservableEnvelopeCollection : ObservableCollection<Envelope>
{
    public decimal Total
    {
        get
        {
            decimal total = 0;
            foreach (Envelope env in this)
            {
                total += env.Balance;
            }
            return total;
        }
    }

    public decimal SavingsTotal
    {
        get
        {
            blah blah. . .
        }
    }
}
公共类ObservableDevelopeCollection:ObservableCollection
{
公共十进制总数
{
得到
{
小数总数=0;
foreach(本文件中的信封环境)
{
合计+=环境平衡;
}
返回总数;
}
}
公共十进位储蓄总额
{
得到
{
胡说八道。
}
}
}
我能够毫无困难地将我的datagrid数据绑定到集合中,但是在我的datagrid下面有标签,我需要显示集合中信封的余额总额。我可以将数据绑定到集合的Count属性,该属性是父ObservableCollection类的属性,但无法将数据绑定到自定义类的Total或SavingsTotal。

当程序运行时,标签是空白的,如果我使用VS2010设计器并转到标签内容的小数据绑定向导,它会在“Total”下面加上下划线,并显示工具提示:“无法解析路径项“Total”。同样,如果我将路径更改为EnvColl.Count,它会工作

<Label Content="{Binding Path=EnvColl.Total}"/>


还有一点需要注意的是,在我的ViewModel中,我可以毫无问题地访问集合中的Total和SavingsTotal属性,只是在XAML/databinding中它不起作用。

呸!我讨厌这样的事情发生。。。我按照Kent添加BindsDirectlyToSource=true,并将其添加到错误的位置,导致生成错误。然后我将其移除并重建,数据绑定突然开始工作…:\我曾多次重建解决方案,但都不走运,但导致编译错误,然后将其删除,使事情开始工作。想知道2010的编译器中是否有错误…?

vs2010

(像往常一样,一些新广告可能需要了解这个问题。)

当我多次在调试模式下运行应用程序时,我就遇到了这种情况,突然我不得不杀死它/停止调试器,然后我注意到它不知道何时必须重新编译代码


我注意到,如果我关闭并重新打开应用程序/解决方案,这会有很大帮助。如果您在调试模式下运行,您肯定必须经常这样做。

我知道这是几年前发布的,但我遇到了一个类似的问题,我有一个
网格,其中包含
标签和
数据网格。我能够将我的
DataGrid
ItemsSource
设置为
observeCollection
,但我无法访问我的
标签中所需的属性。因此,我所做的是将包含
网格的
DataContext
设置为
observedcollection
,然后使用绑定的
RelativeSource
属性来查找祖先(
Grid
)。语法如下所示:

<Grid DataContext = "{Binding MyObservableCollection}">
    <Label Content = "{Binding MyDesiredProperty}"/>
    <DataGrid ItemsSource = "{Binding Path=DataContext, RelativeSource={RelativeSource Mode=FindAncestor, AncestoryType={x:Type Grid}}}">
    </DataGrid>
</Grid>


我认为这达到了原始海报的目的。如果没有,希望它能帮助其他人。

您在绑定上尝试过BindsDirectlyToSource=true吗?