我有一个文本框,它绑定到我的viewmodel中的Int
属性,该属性获得ObservableCollection
的计数。这是我的Xaml绑定:
Text="{Binding ArticleCount, Mode=OneWay}"
我的int属性:
private Int32 _ArticleCount;
public int ArticleCount
{
get
{
if (this.ModelviewArticleObservableList == null)
{
return 0;
}
else
{
return this.ModelviewArticleObservableList.Count;
}
}
}
这适用于应用程序初始化,我在我的用户界面ObservableCollection
中得到TextBox
计数。但是,有些方法会更改ObservableCollection
,因此会更改计数。我需要一个Property Changed事件来通知计数何时发生变化,但我不确定如何做到这一点?这是我的ObservableCollection
属性:
private ObservableCollection<viewArticle> _ModelviewArticleObservableList = new ObservableCollection<viewArticle>();
public ObservableCollection<viewArticle> ModelviewArticleObservableList
{
get { return _ModelviewArticleObservableList; }
set
{
_ModelviewArticleObservableList = value;
OnPropertyChanged("ModelviewArticleObservableList");
}
}
我目前正在实施INPC:
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
答案 0 :(得分:2)
每次集合中元素的数量发生变化时,您都必须引发PropertyChanged
事件。一个好方法是订阅ObservableCollection
的{{3}}事件。
private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
// you could examine e to check if there is an actual change in the count first
OnPropertyChanged("ArticleCount");
}
此外,还有一种情况是集合本身设置为null
或不同的值,在这种情况下,您的ArticleCount
属性也应该更改。您还必须从旧集合中删除CollectionChanged
事件处理程序,并将其添加到新集合中。
public ObservableCollection<viewArticle> ModelviewArticleObservableList
{
get { return _ModelviewArticleObservableList; }
set
{
if (_ModelviewArticleObservableList != null)
{
_ModelviewArticleObservableList.CollectionChanged -= OnCollectionChanged;
}
_ModelviewArticleObservableList = value;
if (_ModelviewArticleObservableList != null)
{
_ModelviewArticleObservableList.CollectionChanged += OnCollectionChanged;
}
OnPropertyChanged("ModelviewArticleObservableList");
OnPropertyChanged("ArticleCount");
}
}
答案 1 :(得分:2)
ModelviewArticleObservableList是ViewModel的公开可见属性吗?
如果是这样,您可以将TextBox直接绑定到它的Count属性。
Text="{Binding Path=ModelviewArticleObservableList.Count}"
你需要&#34; Path =&#34;因为你没有绑定直接财产。 &#34; Mode = OneWay&#34;是不必要的。
ObservableCollection实现了INotifyPropertyChanged,并且每次更新集合时都会通知Count属性。
顺便说一下,为什么使用TextBox而不是TextBlock来获取无法在UI中编辑的值?