WPF具有ItemsSource属性的own UserControl
我想用ItemsSource属性创建一个自己的Usercontrol。 我已经创建了一个UserControl“myContainer”和一个UserControl“myItem”。现在我想在myContainer控件中显示myItem控件。因此,我在myContainer控件中声明了一个依赖属性ItemsSource。 但是,如果我启动一个测试项目并将集合绑定到itemssource属性,则不会发生任何事情。这是实现itemssource属性的正确方法吗 Xaml:myContainerWPF具有ItemsSource属性的own UserControl,wpf,xaml,user-controls,itemssource,Wpf,Xaml,User Controls,Itemssource,我想用ItemsSource属性创建一个自己的Usercontrol。 我已经创建了一个UserControl“myContainer”和一个UserControl“myItem”。现在我想在myContainer控件中显示myItem控件。因此,我在myContainer控件中声明了一个依赖属性ItemsSource。 但是,如果我启动一个测试项目并将集合绑定到itemssource属性,则不会发生任何事情。这是实现itemssource属性的正确方法吗 Xaml:myContainer &l
<UserControl x:Class="Control.myContainer"
...
x:Name="myUserControl">
<Grid>
<DockPanel x:Name="myDockPanel">
</DockPanel>
</Grid>
您似乎有一个项目类型,基本上如下所示:
public class DataItem
{
public string Header { get; set; }
public object Content { get; set; }
}
您可以通过一个列表框来显示此类型的项目,列表框中的项目具有DataTemplate
,由属性设置:
<ListBox ItemsSource="{Binding DataItems}">
<ListBox.ItemTemplate>
<DataTemplate>
<Border BorderThickness="3" BorderBrush="Aqua">
<StackPanel Margin="10">
<TextBlock Text="{Binding Header}"/>
<ContentPresenter Content="{Binding Content}"/>
</StackPanel>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<ListBox ItemsSource="{Binding DataItems}">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<DockPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
...
</ListBox>
编辑:除了使用DataTemplate,您还可以通过在
ItemsContainerStyle
中的样式中替换ListBoxItem的ControlTemplate来完全替换ListBoxItem的视觉外观:
<ListBox ItemsSource="{Binding DataItems}">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Border BorderThickness="3" BorderBrush="Aqua">
<StackPanel Margin="10">
<TextBlock Text="{Binding Header}"/>
<ContentPresenter Content="{Binding Content}"/>
</StackPanel>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
...
</ListBox>
...
您的物品类型基本上如下所示:
public class DataItem
{
public string Header { get; set; }
public object Content { get; set; }
}
您可以通过一个列表框来显示此类型的项目,列表框中的项目具有DataTemplate
,由属性设置:
<ListBox ItemsSource="{Binding DataItems}">
<ListBox.ItemTemplate>
<DataTemplate>
<Border BorderThickness="3" BorderBrush="Aqua">
<StackPanel Margin="10">
<TextBlock Text="{Binding Header}"/>
<ContentPresenter Content="{Binding Content}"/>
</StackPanel>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<ListBox ItemsSource="{Binding DataItems}">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<DockPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
...
</ListBox>
编辑:除了使用DataTemplate,您还可以通过在
ItemsContainerStyle
中的样式中替换ListBoxItem的ControlTemplate来完全替换ListBoxItem的视觉外观:
<ListBox ItemsSource="{Binding DataItems}">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Border BorderThickness="3" BorderBrush="Aqua">
<StackPanel Margin="10">
<TextBlock Text="{Binding Header}"/>
<ContentPresenter Content="{Binding Content}"/>
</StackPanel>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
...
</ListBox>
...
从ListBox或ItemsControl派生并将属性设置为DockPanel要容易得多。通过重写,您可以创建自己的项目类型。@Clemens我想这是问题的答案,而不是注释。您能给我举个例子吗?从您的代码很难判断您将要实现什么。我猜您的项目将显示标题文本和一些其他内容(无论是什么)。你能提供更多关于你想要什么的信息吗?您的项目类型是什么以及如何可视化?您应该知道这篇文章:。从ListBox或ItemsControl派生并将属性设置为DockPanel要容易得多。通过重写,您可以创建自己的项目类型。@Clemens我想这是问题的答案,而不是注释。您能给我举个例子吗?从您的代码很难判断您将要实现什么。我猜您的项目将显示标题文本和一些其他内容(无论是什么)。你能提供更多关于你想要什么的信息吗?您的项目类型是什么以及如何可视化?您应该知道这篇文章:。有没有办法在listbox项目中显示usercontrol?我会这样做,但当我单击用户控件中的按钮时,例如,仅选择listboxitem,您可以设置而不是ItemTemplate。我只找到一种方法来设置listboxitem的样式,但我不能使用usercontrol中的对象:/我的意思是在样式设置器中设置listboxitem的ControlTemplate。请参阅我的编辑。我的操作与您的示例中完全相同,listboxitems显示正确,但我无法访问由绑定加载到contentpresenter中的usercontrol中的对象(按钮)。我看到按钮,但无法单击。是否有办法在列表框项目中显示usercontrol?我会这样做,但当我单击用户控件中的按钮时,例如,仅选择listboxitem,您可以设置而不是ItemTemplate。我只找到一种方法来设置listboxitem的样式,但我不能使用usercontrol中的对象:/我的意思是在样式设置器中设置listboxitem的ControlTemplate。请参阅我的编辑。我的操作与您的示例中完全相同,listboxitems显示正确,但我无法访问由绑定加载到contentpresenter中的usercontrol中的对象(按钮)。我看到了按钮,但不能点击它