Проблема WPF porpertygrid с коллекцией внутри коллекции
У меня есть приложение WPF с сеткой свойств. Я привязываю сетку свойств к объекту класса (скажем, имя класса «mainclass»). «Основной класс» имеет свойство «APIConditions», которое является наблюдаемой коллекцией другого настраиваемого класса «SearchAPIModel». SearchAPIModel имеет свойство observablecollection класса KeyValues. Я добавил элемент в коллекцию «APIConditions», используя пользовательский интерфейс сетки свойств. Вновь добавленный объект в коллекцию успешно сохраняется. Но проблема, с которой я столкнулся, заключается в том, что я могу привязать объект «основной класс» к сетке свойств, но когда я пытаюсь открыть свойство «APIConditions», которое должно открываться во всплывающем окне, приложение вылетает с ошибкой
- Необработанное исключение типа "система".Отражение.TargetParameterCountException ' произошло в PresentationFramework.dll
Дополнительная информация: несоответствие количества параметров."
Может ли кто-нибудь объяснить, почему возникает эта проблема и каково ее решение ?.
Заранее спасибо,
Рашид
Что я уже пробовал:
Пожалуйста, смотрите классы, как показано ниже.
[Serializable] public class MainClass : INotifyPropertyChanged, INotifyCollectionChanged { private string _SelectText, _ID; private ObservableCollection<searchapimodel> _APIConditions; public event PropertyChangedEventHandler PropertyChanged; public event NotifyCollectionChangedEventHandler CollectionChanged; private void OnNotifyPropertyChanged(string propertyName) { var tmp = PropertyChanged; if (tmp != null) { tmp(this, new PropertyChangedEventArgs(propertyName)); } } [CategoryAttribute("TextBox Details"), DefaultValueAttribute(true), DescriptionAttribute("ID of the TextBox control"), ReadOnly(true)] public string ID { get { return _ID; } set { if (_ID != value) { _ID = value; } } } [CategoryAttribute("LookupOption Details"), DefaultValueAttribute(true), DescriptionAttribute("Initial Text For Lookup And Nothing is Selected"), ReadOnly(false)] public string SelectText { get { return _SelectText; } set { if (_SelectText != value) { _SelectText = value; } } } [CategoryAttribute("LookupOption Details"), DefaultValueAttribute(true), DescriptionAttribute("Collection Of SearchAPIModel.")] public ObservableCollection<searchapimodel> APIConditions { get { return _APIConditions; } set { if (_APIConditions != value) { _APIConditions = value; } } } public MainClass() { this.SelectText = "[SELECT]"; this.ID = ""; this.APIConditions = new ObservableCollection<searchapimodel>(); } }
Класс SearchAPIModel
[Serializable] public class SearchAPIModel : INotifyPropertyChanged, INotifyCollectionChanged { private string _ConditionRow; public event PropertyChangedEventHandler PropertyChanged; public event NotifyCollectionChangedEventHandler CollectionChanged; private ObservableCollection<keyvalues> _SearchTextList; private void OnNotifyPropertyChanged(string propertyName) { var tmp = PropertyChanged; if (tmp != null) { tmp(this, new PropertyChangedEventArgs(propertyName)); } } [CategoryAttribute("API Condition Details"), DefaultValueAttribute(true), DescriptionAttribute("ConditionRow")] public string ConditionRow { get { return _ConditionRow; } set { if (_ConditionRow != value) { _ConditionRow = value; OnNotifyPropertyChanged(""); } } } [CategoryAttribute("API Condition Details"), DefaultValueAttribute(true), DescriptionAttribute("SearchTextList")] public ObservableCollection<keyvalues> SearchTextList { get { return _SearchTextList; } set { _SearchTextList = value; if (_SearchTextList != value) { _SearchTextList = value; } } } public SearchAPIModel() { this.ConditionRow = ""; this.SearchTextList = new ObservableCollection<keyvalues>(); } }
Класс KeyValues
[Serializable] public class KeyValues : INotifyPropertyChanged { private string _key, _Value; [ReadOnly(false)] public string Key { get { return _key; } set { _key = value; } } [ReadOnly(false)] public string Value { get { return _Value; } set { _Value = value; } } public KeyValues() { Key = ""; Value = ""; } public event PropertyChangedEventHandler PropertyChanged; private void OnNotifyPropertyChanged() { var tmp = PropertyChanged; if (tmp != null) { tmp(this, new PropertyChangedEventArgs("")); } } }