【问题标题】:Inherit from ListBox从列表框继承
【发布时间】:2014-04-12 15:42:46
【问题描述】:

我在我的项目中使用多个列表而不是树 - 用于适当的虚拟化(树结构中的许多项目)。 这些列表几乎相同。唯一的区别在于 DataTemplates。这些列表绑定了一些事件,我必须在几个地方复制和更新。当前事件用于:

  • 防止水平自动滚动
  • 支持箭头键在树状结构中导航

我发现无法在资源字典中以单一样式绑定事件,因为事件必须属于特定类。所以我必须在类之间复制完全相同的事件并将它们绑定到特定的列表。这是相当多的文本,包括 XAML 和代码。

我想做的是定义一个新的用户控件,从标准 ListBox 派生所有内容,但覆盖一些次要方法(而不是事件)。并在我需要此类列表的任何地方重复使用此控件,而无需复制所有事件。

问题 是 - 它需要我定义自定义 。有没有办法只使用 ListBox 模板/样式?我不需要从标准 ListBox 进行 GUI 修改。

我可能会错过一些简单的方法来执行我想要的。我将不胜感激。

【问题讨论】:

    标签: c# wpf xaml listbox


    【解决方案1】:

    不确定您的设置,但您可能必须覆盖 ListBox 和 ListBoxItem。然后重写一些方法:

    public partial class MyListBox: ListBox
    {
    
        protected override System.Windows.DependencyObject GetContainerForItemOverride()
        {
            return new MyListBoxItem();
        }
    
        protected override bool IsItemItsOwnContainerOverride(object item)
        {
            return item is MyListBoxItem;
        }
    }
    
    public class MyListBoxItem : ListBoxItem
    {
    
    }
    

    这将强制您的容器被 ListBoxItem 覆盖。

    现在您只需在 ListBoxItem 覆盖中实现您的特定代码 tof 键。如果您不需要任何样式更改,则将应用默认的 ListBox 样式。

    现在您可以在 XAML 中使用它了:

    <local:MyListBox ItemsSource="{Binding Items}">
        <local:MyListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding id}"/>
            </DataTemplate>
        </local:MyListBox.ItemTemplate>
    </local:MyListBox>
    

    【讨论】:

    • 代码中的类继承不是问题。问题是如果没有为它定义 XAML UserControl,我就不能使用这个被覆盖的类。 Visual Studio 只是告诉我这样的类在 WPF 中不可用。尝试把 MyList 放到你的窗口上。
    • 我刚刚对其进行了测试,一切正常。你能从 VisualStudio 发布准确的错误消息吗?
    • 奇怪,在我的项目中试过这个 - 但它没有用。在空白项目中尝试了同样的事情 - 它构建得很好。感谢帮助!对不起,愚蠢的错误。
    猜你喜欢
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多