Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# BindingList元素的属性发生更改时缺少PropertyChanged事件_C#_.net_Data Binding_Collections - Fatal编程技术网

C# BindingList元素的属性发生更改时缺少PropertyChanged事件

C# BindingList元素的属性发生更改时缺少PropertyChanged事件,c#,.net,data-binding,collections,C#,.net,Data Binding,Collections,我有一个类ViewModel,它有一个类型为bindingslist的属性MyList ViewModel实现了INotifyPropertyChanged Foo具有属性FooProp FooimplementsINotifyPropertyChanged ViewModel具有以下属性: public bool IsButtonEnabled { get { return MyList.Any(x=> x.FooProp!=null); } }

我有一个类
ViewModel
,它有一个类型为
bindingslist
的属性
MyList

ViewModel
实现了
INotifyPropertyChanged

Foo具有属性
FooProp

Foo
implements
INotifyPropertyChanged

ViewModel具有以下属性:

public bool IsButtonEnabled
  {
    get
    {
      return MyList.Any(x=> x.FooProp!=null);
   }
}
我有一个带按钮的视图。按钮的Enabled属性绑定到
isButtonneEnabled


但是当
MyList
的某个元素设置了
FooProp
时,该按钮不会被启用。我注意到,
ViewModel
不会在这里触发
PropertyChanged
事件。为什么不呢?我该如何让视图模型注意到它的
IsButtonEnabled
属性实际上已更改?

编辑:没有注意到这是一个getter而不是setter。这一点仍然是一样的。简单地实现
INotifyPropertyChanged
接口并不会自动添加所需的所有内容。您需要创建触发事件的方法(如下)。然后需要在所有属性的SETTER中调用该方法

你不应该自己炒掉财产变更事件吗

public bool IsButtonEnabled
{
    get
    {
        return MyList.Any(x=> x.FooProp!=null);

        // assuming you named the method this
        OnPropertyChanged("IsButtonEnabled");
    }
}
INotifyPropertyChanged
界面仅为您创建事件。您需要自己从ViewModel触发事件

如果尚未创建该方法,则此方法正常工作。当ViewModel的属性更改时,可以显式调用此方法

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

ViewModel不会触发此处更改的任何属性,因为ViewModel的属性未更改。更改的实际属性
FooProp
,它是Foo类的属性,而不是ViewModel

为了基于
IsButtonEnabled
功能启用/禁用按钮,您必须跟踪MyList的所有元素,并查看是否进行了任何更改。因此,以下措施应该有效:

public class Foo : INotifyPropertyChanged
{
    void OnPropertyChanged(string propertyName) { /* ... */ }
    public object FooProp 
    { 
        get { return _obj; }
        set 
        {
            _obj = value;
            OnPropertyChanged("FooProp");
        }
    }
}

public class ViewModel : INotifyPropertyChanged
{
    void OnPropertyChanged(string propertyName) { /* ... */ }

    private List<Foo> _myList;
    public List<Foo> MyList 
    { 
        get { return _myList; }
        set 
        {
            _myList = value;
            foreach(var item in _myList) 
            {
                HandleItem(item);
            }
        }
    }

    void AddItem(Foo item) 
    {
        MyList.Add(item);
        HandleItem(item);
    }
    void HandleItem(Foo item) 
    {
        item.PropertyChanged += (s, e) =>
        {
            if(e.PropertyName == "FooProp")
        };
    }
    void ItemPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if(e.PropertyName == "FooProp") OnPropertyChanged("IsButtonEnabled");
    }
    public bool IsButtonEnabled
    {
        get
        {
          return MyList.Any(x=> x.FooProp!=null);
        }
    }
}
公共类Foo:INotifyPropertyChanged
{
void OnPropertyChanged(字符串propertyName){/*…*/}
公共对象属性
{ 
获取{return\u obj;}
设置
{
_obj=值;
OnPropertyChanged(“FooProp”);
}
}
}
公共类视图模型:INotifyPropertyChanged
{
void OnPropertyChanged(字符串propertyName){/*…*/}
私人名单;
公共列表列表
{ 
获取{return\u myList;}
设置
{
_myList=值;
foreach(我的列表中的var项目)
{
HandleItem(项目);
}
}
}
无效附加项(Foo项)
{
MyList.Add(项目);
HandleItem(项目);
}
无效HandleItem(Foo项目)
{
item.PropertyChanged+=(s,e)=>
{
如果(e.PropertyName==“FooProp”)
};
}
void ItemPropertyChanged(对象发送方,PropertyChangedEventArgs e)
{
如果(e.PropertyName==“FooProp”)OnPropertyChanged(“IsButtonneEnabled”);
}
公共布尔值已禁用
{
得到
{
返回MyList.Any(x=>x.FooProp!=null);
}
}
}
请注意,在这种情况下,您需要使用ViewModel.AddItem()将项目添加到MyList(您可以使用MyList.add(),但它不会触发正确的通知)


此外,上面的代码并不是最好的方法——它只是说明您的案例应该如何工作。在您了解到您可能要将列表替换为ObservableCollection,以便能够自动跟踪/处理列表中的项目后。

您可以发布其余代码吗?所有Fooprop应该不同于null还是只有一个?在该getter中触发事件毫无意义;)你是对的。我甚至没有注意到这是一个有成就感的人,而不是一个二传手。