ViewModel не будет запускать здесь любую PropertyChanged, потому что свойства 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);
}
}
}
Обратите внимание, что в этом случае вам нужно использовать ViewModel.AddItem () для добавления элемента в MyList (вы можете использовать MyList.Add (), но этотогда не будут генерироваться правильные уведомления).
Также приведенный выше код не лучший способ сделать это - это просто иллюстрация того, как должен работать ваш случай.После того, как вы поймете, что вы, вероятно, собираетесь заменить List <> на ObservableCollection <>, чтобы иметь возможность автоматически отслеживать / обрабатывать элементы в вашем списке.