如果我创建一个扩展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
答案 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