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