Я пытаюсь связать пользовательский класс с элементом itemssource WPF DataGrid из C#. Я реализовал IList, но по какой-то причине я не могу получить список, чтобы показывать всех участников.Связывание пользовательских структур данных с DataGrid ItemsSource в WPF
Я устанавливаю свойство ItemsSource в C# по телефону
dataGridObject.ItemsSource = switchHolderObject
Вот определение для моего значения:
public class AssetHolder<T> : Dictionary<string,T>, IList<T>, INotifyCollectionChanged, INotifyPropertyChanged where T : Asset
{
... // lots of code here
new public IEnumerator<T> GetEnumerator()
{
var enumerator = base.GetEnumerator();
while (enumerator.MoveNext())
{
var pair = enumerator.Current;
yield return pair.Value;
}
}
}
public class NonGenericAssetHolder : AssetHolder<Asset> {}
public class SwitchHolder : NonGenericAssetHolder {}
Причина у меня есть три класса здесь, чтобы обойти тот факт, что словари в C# не ковариантны.
Я проверил, что все мои реализованные методы IList работают исправно, и список расширяет и имеет соответствующие данные, но DataGrid по-прежнему не показывает членов. Странно то, что это работает, когда я добавить этот метод к классу AssetHolder:
public List<T> Hack()
{
List<T> result = new List<T>();
foreach (T asset in this)
{
result.Add(asset);
}
return result;
}
и постоянно повторно связать DataGrid как это:
SwitchGrid.ItemsSource = _tempLocation.Switches.Hack();
Однако, это создает огромный удар по производительности, и я чувствую, что он должен работать так, как есть. Кто-нибудь знает, что происходит? Почему DataGrid не покажет мои данные?
Вы реализовали 'GetEnumerator()' правильно? Вы используете его? На стороне примечание: я всегда устанавливаю 'DataContext'' ItemsControl' в кодировке и устанавливаю 'ItemsSource' в Xaml только для' ItemsSource = "{Binding}" 'таким образом, у вас больше изменений BindingErrors, появляющихся в в окне вывода, чтобы вы могли лучше диагностировать, что происходит. – Silvermind
Я думаю, он зависит от места, где вы заполняете данные в классе AssetHolder. Вы должны заполнить его в конструкторе, чтобы использовать его так, как это. Или вы можете связать ItemSource с методом Hack, но вы должны использовать AssetHolder как тип возврата, IMO: public AssetHolder Hack() {return this; } –
JiKra
@Silvermind Dictionary реализует IEnumerable, поэтому я только что изменил функцию GetEnumerator, чтобы вернуть только значения.Я подтвердил, что он работает правильно, и я добавил его в свой пост выше. – hypehuman