为源项目扩展WPF ListBoxItem不起作用

时间:2011-07-28 21:07:32

标签: c# wpf xaml listbox listboxitem

如果我创建一个扩展WPF的ListBoxItem的类,创建这些对象的列表,尝试将列表绑定到ListBox的ItemsSource,则不会显示这些项:

<ListBox ItemsSource="{Binding Path=LbData, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}">
    <ListBox.ItemTemplate>
        <DataTemplate >
            <TextBlock Text="{Binding Path=Display}" Margin="1" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
public partial class MainWindow : Window
{
    public IEnumerable lbData = new List<LbItem>();
    public IEnumerable LbData
    {
        get { return lbData; }
        set { lbData = value; }
    }

    public MainWindow()
    {
        InitializeComponent();
        LbData = new List<LbItem> { new LbItem("a"), new LbItem("b") };
    }
}

public class LbItem : ListBoxItem
{
    public string Display { get; private set; }

    public LbItem(string v)
    {
        Display = v;
    }
}

我是WPF的新手,不明白为什么这应该是一个问题。 TIA

2 个答案:

答案 0 :(得分:3)

ItemsSource通常用于数据对象,你在那里做的事情(设置ItemTemplate)表明你不应该让你的对象继承ListBoxItem,而是它应该是一个普通对象(如果属性在创建后可能会改变,则可能实现INotifyPropertyChanged)。如果列表发生更改,则应实施INotifyCollectionChanged

由于这些项目已经ListBoxItems,因此您设置的DataTemplate将被忽略。 Visual Studio输出窗口中应该出现以下错误:

  

System.Windows.Data错误:26:对于ItemsControl容器类型的项目,将忽略ItemTemplate和ItemTemplateSelector;类型= 'LbItem'

答案 1 :(得分:0)

尝试在InitializeComponent()之前设置LbData;或实现INotifyPropertyChanged你也可能想要绑定到ObservableCollection