【发布时间】:2025-12-22 18:55:11
【问题描述】:
我有一个 ObservableCollection,我需要绑定到 2 个标签,第一个显示集合中的项目数,第二个显示值的总和。
第一个标签绑定到集合计数属性,第二个标签直接绑定到 ObservableCollection,使用转换器计算所有项目的总数
XAML 看起来像这样
<Grid>
<ListBox Name="itemList" ItemsSource="{Binding DataList}"/>
<Label Name="lblcount" Content="{Binding DataList.Count}" />
<Label Name="lblTotal" Content="{Binding DataList, Converter={StaticResource calculateTotalConvertor}" />
</Grid>
我的虚拟机有一个这样的集合
ObservableCollection<int> data = new ObservableCollection<int>();
public ObservableCollection<int> DataList
{
get { return data; }
set { data = value; }
}
我的转换器代码是
public class CalculateTotalConvertor : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
ObservableCollection<int> collection = value as ObservableCollection<int>;
return collection.Sum();
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
问题在于在 DataList、ListView 中添加新项目,并且显示项目计数的标签已更新,但“lblTotal”未随总计数更新。
基本上如何强制您的绑定在 ObservableCollection 更改时进行评估?它如何直接用于 ListView 或 DataGrid 而不是用于 label ?
我知道这个问题可以通过在 VM 中创建一个属性来解决,以便在集合更新时显示总数并引发属性更改,但是还有比这更好的解决方案吗?
当然,这是我实际问题的简化形式,我无法访问 ViewModel 和集合,它是第三方控件。我正在创建一个包装用户控件,并与视图与其内部集合进行相对绑定。
【问题讨论】:
-
你试过
set { data = value; RaisePropertyChanged("Data"); }吗? -
老实说,我会提供一个完全符合您要求的属性,并处理 VM 中的逻辑。为此使用 Converter 有点奇怪,我尽量避免使用它。想一想,转换应该将一个值转换为另一个值,您正在将一个列表转换为一个数字。如果初始值被更新,则再次调用转换器,在您的情况下,它保持不变,只是它的内部状态发生了变化。为此使用您的虚拟机,为视图提供和预处理数据是视图模型的主要目的。
-
@dowhilefor 我同意你的看法...我想知道 DataGrid 如何在集合更改时更新以及我是否可以在这里做同样的事情。我的实际用例有很多不同和复杂。我已经编辑了问题。
-
@AndreyGordeev RaisePropertychanged 不会有帮助,因为集合属性本身没有改变。
标签: wpf xaml data-binding