1

我已将 WatchList 定义如下:

// a named list of VariableWatchers
public class WatchList : List<VariableWatcher>
{
    private string _name;

    public WatchList(string name) : base()
    {
        _name = name;
    }

    public override string ToString()
    {
        return _name;
    }
}

我将 WatchLists 列表绑定到 ComboBox 的 ItemsSource 属性,如下所示:

<ComboBox x:Name="WatchListDropdown"
          ItemsSource="{Binding Path=WatchLists}"
          VerticalAlignment="Center"
          Margin="5"/>

“WatchLists”指的是我的 DataContext 中的以下属性:

public IList<WatchList> WatchLists
{
    get { return _watchLists; }
}

一切都很好,除了列表中的所有条目都显示为“(集合)”而不是 _name 变量。我在 ToString 中放置了一个断点,并确认它在某个时候被调用,并返回正确的值,但不知何故 ComboBox 仍然显示“(Collection)”。

4

3 回答 3

5

不知道为什么它不使用 ToString() 覆盖,但您是否考虑过使用 DisplayMemberPath 代替?

<ComboBox x:Name="WatchListDropdown"
      ItemsSource="{Binding Path=WatchLists}"
      VerticalAlignment="Center"
      DisplayMemberPath="Name"
      Margin="5"/>

当然,您需要调整对象,因为绑定需要公共属性或依赖属性。

private string _name;
public string Name { get { return _name; } set { _name = value; } }
于 2012-10-24T19:41:13.367 回答
0

WatchLists 不是 WatchList 的集合吗?因此 Collection.ToString() 将被调用并显示。

如何将 DisplayMemberPath 指定为“名称”?我希望它有效:)

于 2012-10-24T19:37:10.123 回答
0

如果 ItemsSource 绑定到单个WatchList类型List<VariableWatcher>,则实际显示的集合将是 的列表VariableWatcher

如果 ItemsSource 绑定到WatchList.ToString() 的集合,则应覆盖默认显示。当然,您始终可以创建一个属性Name并将其设为 DisplayMember。

于 2012-10-24T19:39:58.270 回答