【问题标题】:Extending WPF ListBoxItem for sourced items not working为来源项目扩展 WPF ListBoxItem 不起作用
【发布时间】:2011-07-28 21:07:32
【问题描述】:

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

【问题讨论】:

  • 你能定义“不会显示”吗?列表框是空的吗?或者,它是否显示了一些东西,而不是你想要的?
  • 是的,抱歉,列表框将为空。在这个简单的示例中,从 ListBoxItem 中删除继承将使其工作。在实际项目中,我希望这些物品具有 LBI 的功能。
  • 使用ListBox.ItemContainerGenerator.ContainerFromItem(an item)可以达到效果,但如果不知道为什么不起作用就好了。

标签: c# wpf xaml listbox listboxitem


【解决方案1】:

ItemsSource 通常用于数据对象,您在那里所做的(设置ItemTemplate)建议您根本不应该让您的对象从ListBoxItem 继承,而应该是一个普通对象(如果属性在创建后可能发生变化,则可能实现INotifyPropertyChanged)。如果列表发生变化,它应该实现INotifyCollectionChanged

因为项目已经是ListBoxItems,所以您设置的DataTemplate 将被忽略。您的 Visual Studio 输出窗口中应该有以下错误:

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

【讨论】:

  • 感谢您的反馈,但我正在寻找为什么这不起作用的解释,以便我可以建立我对 WPF 的知识和直觉。
  • 啊,我在评论你的第一个版本。我在调试模式下构建或运行时没有看到该错误。
  • 它只出现在输出窗口中,并且只有在相应的通知打开时才会出现(默认情况下应该是),有关一些信息,请参阅Debugging Data-Bindings in WPF
【解决方案2】:

尝试在 InitializeComponent() 之前设置 LbData;或实现 INotifyPropertyChanged,您可能还想绑定到 ObservableCollection

【讨论】:

  • 在 InitializeComponent() 之前设置 LbData 并没有帮助。列表框也不需要 ObservableCollections。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-08
  • 2017-11-17
  • 2022-11-20
  • 1970-01-01
相关资源
最近更新 更多