我在WPF c#应用程序(MVVM模式)中有一个数据网格,其ItemsSource
绑定到ICollectionView
,类似于:
public ICollectionView PendingBills { get; private set; }
public BillsViewModel()
{
_penBills = m.PBills;
PendingBills = new ListCollectionView(_penBills)
{
Filter = o => ((Bills)o).PaidOn==""
};
}
....
<DataGrid ItemsSource="{Binding PendingBills}"
现在我已经将数据网格的行数绑定到一个textblock文本,使用如下内容(它显示过滤后的所有行数)
<TextBlock Text="{Binding PendingBills.Count, StringFormat='Total Pending Bills : {0}'}" ...
但是我也想绑定行计数到一个不同的文本块,说数据库的BillNo
列数据有一个特定的文本,或者可能是空的或非空的东西,
我该怎么做?我是否需要使用某种IValueConverter
?如果是,如何使用?
更新我试过给视图模型添加属性,比如
private int _cnt;
public int Cnt
{
get
{
if (_cnt == 0) _cnt = _penBills.Where(x => !String.IsNullOrEmpty(x.PaidOn.ToString())).Count();
return _cnt;
}
set
{
_cnt =value;
}
}
,然后像Text="{Binding Cnt}"
一样使用它,但它不起作用。
虽然您总是可以使用转换器,是的(这是我基于这里的经验的个人意见),但您可能只想在后面的代码中这样做。您可以存储一个属性,该属性根据linq查询获取您正在查找的计数,并简单地绑定到该属性。
让我举个例子。您可以返回与某些文本匹配的元素:
var countOfMatches = yourlist.Where(x => x.SOMEVALUE == SOMETEXT).Count();
或者你可以用一些数字条件:
var countOfMatches = yourList.Where(x => x.Price > 400).Count();
我希望这是一个对你有帮助的答案。
总之,我想说的是,如果你想要一个基于这个列表的自定义计数,你最好为它创建一个属性,并通过查询来设置它。
根据你的编辑:将查询更改为:
_penBills.Where(x => x.PaidOn.ToString() != string.Empty).Count();
(这只是一个挑剔)
至于你的绑定,你能确认账单的可观察集合和这个新的整数属性存储在一个视图模型上,这个视图模型是这个example .cs视图的数据上下文吗?