【发布时间】:2012-03-16 21:45:11
【问题描述】:
我正在尝试从 c# 将自定义类绑定到 WPF DataGrid 的 itemssource 成员。我实现了 IList,但由于某种原因,我无法让列表显示任何成员。
我通过调用在 C# 中设置 ItemsSource 属性
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()对吗?你在用吗?附带说明:我总是在代码隐藏中设置ItemsControl的DataContext,并在Xaml 中将ItemsSource设置为ItemsSource="{Binding}",这样您在输出窗口中就会出现更多的BindingErrors 变化,所以您可以更好地诊断出了什么问题。 -
我猜,它取决于您在 AssetHolder 类中填充数据的位置。您必须在构造函数中填写它才能以这样的方式使用它。或者,您可以将 ItemsSource 绑定到 Hack 方法,但您应该使用 AssetHolder
作为返回类型,IMO:public AssetHolder Hack() { return this; } -
@Silvermind Dictionary 实现了 IEnumerable,所以我只是修改了 GetEnumerator 函数以仅返回值。我已经确认它可以正常工作,并将其添加到我上面的帖子中。
-
您是否还通过在 GetEnumerator 中放置断点确认它在不由代码访问而仅由 Xaml 访问时可以正常工作?这样,如果 Xaml 触发它,我们现在将这样做,抱歉,如果您已经指出这一点,请确保。
-
@Silvermind 按照您的建议修改了绑定,但不幸的是在这种情况下我仍然没有收到任何 BindingErrors。
标签: c# wpf binding ilist itemssource