在WPF中的Count属性的INotifyPropertyChanged?

时间:2014-06-12 09:08:47

标签: c# wpf mvvm inotifypropertychanged

我有一个文本框,它绑定到我的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));
    }

2 个答案:

答案 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中编辑的值?