ObservableCollection,OnPropertyChanged没有触发

时间:2016-05-06 09:04:46

标签: c# wpf observablecollection

我是初学者,我试图到处寻找类似的问题,这个问题已被多次询问,但我找不到任何解决方案。

我像这样实现INotifyPropertyChanged(它工作正常):

    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            MessageBox.Show("property changed");
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

我的observablecollection看起来像这样:

    ObservableCollection<bool>  Test = new ObservableCollection<bool>(new[] { false, false, false, false, false, false });

    private ObservableCollection<bool> _Collection;
    public ObservableCollection<bool> Collection
    {
        get { return _Collection = Test; }
        set { _Collection = value; OnPropertyChanged("Collection"); }
    }

此集合绑定到usercontrols中包含的togglebutton属性:

VidFlipX="{Binding DataContext.Collection[1], ElementName=cmix, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

使用它们时数据更改正确但如果我以其他方式设置了集合,OnPropertyChanged未触发,因此我的togglebuttons不会更新。

无法找出原因......

2 个答案:

答案 0 :(得分:1)

更改收藏品时,您不会更改收藏品。所以你不是在打电话给你的收藏家。要更新Ui上的项目,您馆藏中的项目必须实施与here所述的INotifyPropertyChanged。

解决方案可能是这样的:

ObservableCollection<ClassA> Test { get; set; }

上课:

class ClassA : INotifyPropertyChanged
{
    private bool _isEnabled;
    public bool IsEnabled
    {
        get { return _isEnabled; }
        set
        {
            if (value != _isEnabled)
            {
                _isEnabled = value;
                OnPropertyChanged("IsEnabled");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

答案 1 :(得分:0)

你不能打电话

return _Collection = Test;

在你的Collection属性的getter中,因为这会使setter(因而整个INotifyPropertyChanged实现)变得无用。传递给setter的value从未在任何地方使用过。

当您需要使用预定义的集合初始化您的属性时,您可以这样做:

private ObservableCollection<bool> _Collection
    = new ObservableCollection<bool>(new[] { false, false, false, false, false, false });

public ObservableCollection<bool> Collection
{
    get { return _Collection; }
    set { _Collection = value; OnPropertyChanged("Collection"); }
}