如何使ListView和ListViewItem的用户控件相互协作?

时间:2014-04-14 22:35:48

标签: wpf listview user-controls listviewitem

我为ListViewListViewItem设置了所有样式,触发器等,我希望将它们转换为用户控件。我如何确保这两个"匹配"彼此相关,以便MyListView接受MyListViewItem作为内容?另外,考虑到我必须在用户控件XAML文件末尾结束ListView标记,我不确定如何向其中添加项目。

2 个答案:

答案 0 :(得分:1)

继承为您处理。换句话说,如果你有两个用户控件,第一个用于ListView的基本元素(不是UserControl),另一个用于ListViewItem(同样不是UserControl),你确保它们分别在.cs中扩展ListView和ListViewItem。代码,以下应该平等地工作:

ListView lv = new ListView();
lv.Items.Add(new ListViewItem());

MyListView mlv = new MyListView();
mlv.Items.Add(new myListViewItem()); //If your myListView extends ListView, and myListViewItem extends ListViewItem in your user control files, of course

如果您正在寻找XAML解决方案,则应在顶部

导入命名空间
xmlns:myControls="WhateverYourNamespaceAndAssemblyAre"

并在您的页面/窗口/无论

<myControls:myListView>
    <myControls:myListViewItem/>
    <myControls:myListViewItem/>
</myControls:myListView>

答案 1 :(得分:1)

如果您希望它们可以使用不同的数据集重用,特别是通过绑定,您应该远离UserControls,只需从原始类型派生自定义控件。在这种情况下,您创建一个独立的MyListView.csMyListViewItem.cs,并且控件的所有XAML都会进入ControlTemplate中的默认样式(通常还包含Themes/Generic.xaml)。您可以通过从添加新项目向WPF项目添加WPF自定义控件来查看此设置的示例。

为自定义控件创建.cs文件后,只需覆盖基础ItemsControl中的一些方法,即使用MyListViewItem作为项容器控件。 ListView会像这样结束:

public class MyListView : ListView
{
    static MyListView()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(MyListView), new FrameworkPropertyMetadata(typeof(MyListView)));
    }

    protected override DependencyObject GetContainerForItemOverride()
    {
        return new MyListViewItem();
    }

    protected override bool IsItemItsOwnContainerOverride(object item)
    {
        return item is MyListViewItem;
    }
}

现在,您可以像使用普通MyListView一样使用自定义ListView,包括绑定到ItemsSource