从ListBox继承

时间:2014-04-12 15:42:46

标签: c# wpf xaml listbox

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

  • 阻止水平自动滚动
  • 支持箭头键以浏览树状结构

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

我想要做的是定义一个新的用户控件,从标准ListBox派生一切,但重写一些次要方法(而不是事件)。并且在我需要这样一个列表的地方重用这个控件,而不必复制所有事件。

问题是 - 它要求我定义自定义< UserControl ... />。有没有办法在那里使用ListBox模板/样式?我不需要从标准ListBox中修改GUI。

我可能会错过一些简单的方法来执行我想要的。我很感激任何方式来做到这一点。

1 个答案:

答案 0 :(得分:0)

不确定您的设置,但您可能必须覆盖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>
相关问题