C# 如何在WPF中使用数据绑定为列表中的每个元素创建新的用户控件?
我有一个物品清单。对于列表中的每个项目,我想创建一个绑定到该项目的新用户控件。从我所读到的内容来看,以编程方式执行此操作对于WPF来说是一种糟糕的做法(而且不那么简单),因此我应该使用数据绑定作为解决方案。问题是,我不知道怎么做。在编译时我不知道列表的内容(只是类型),所以我不能为每个元素创建并绑定XAML。谷歌和MSDN似乎没有任何答案,所以也许我想得不对?我需要做什么 谢谢C# 如何在WPF中使用数据绑定为列表中的每个元素创建新的用户控件?,c#,wpf,user-controls,binding,C#,Wpf,User Controls,Binding,我有一个物品清单。对于列表中的每个项目,我想创建一个绑定到该项目的新用户控件。从我所读到的内容来看,以编程方式执行此操作对于WPF来说是一种糟糕的做法(而且不那么简单),因此我应该使用数据绑定作为解决方案。问题是,我不知道怎么做。在编译时我不知道列表的内容(只是类型),所以我不能为每个元素创建并绑定XAML。谷歌和MSDN似乎没有任何答案,所以也许我想得不对?我需要做什么 谢谢 编辑:为了澄清,我正在尝试制作我自己的音乐评分软件,比如玫瑰园。列表将包含所有度量值,用户控件将是它们的视觉表示。您可
编辑:为了澄清,我正在尝试制作我自己的音乐评分软件,比如玫瑰园。列表将包含所有度量值,用户控件将是它们的视觉表示。您可以将标准的
列表框
与自定义项样式一起使用:
在参考资料中的某个地方:
<Style TargetType="{x:Type ListBoxItem}" x:Key="CustomItemStyle">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<yourns:YourControl />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
在您的窗口/页面/用户控件中:
<ListBox ItemsSource="{Binding ...}" ItemContainerStyle="{StaticResource CustomItemStyle}" />
由于您的对象将绑定到列表框,因此将为每个对象创建一个隐式的
ListBoxItem
,并将其DataContext
设置为对象,这样您就可以在YourControl
中使用绑定,而无需担心。这是一种比Julien Lebosquain建议更通用的方法(以及当项目列表包含多个数据类型的对象时将起作用的项目):
创建一个数据模板
,用于显示列表中类型的项目,例如:
<DataTemplate DataType="local:Measure">
<local:MeasureUserControl DataContext="{Binding}"/>
</DataTemplate>
您可以将ItemsControl
的ItemsPanel
属性设置为ItemsPanelTemplate
,以控制用户控件的布局方式,例如:
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
当您不想使用
列表框的功能时,这种方法通常比使用列表框更可取,例如它的默认边框和选择行为。以上所有答案都有效,但我将在我的应用程序中介绍我是如何做到这一点的。
我正在实现利用这些WPF特性的体系结构。
这是我正在使用的一个UserControl
,它有一个ItemsControl
填充了特定类型的项:
<UserControl x:Class="Controls.StepView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:my="clr-namespace:Controls"
Background="Transparent">
<UserControl.Resources>
<DataTemplate DataType="{x:Type my:ParameterViewModel}" >
<my:ParameterView HorizontalAlignment="Stretch" Margin="25 0 0 0"/>
</DataTemplate>
</UserControl.Resources>
<Grid>
<ItemsControl Name="stkStepContent" ItemsSource="{Binding Parameters}" />
</Grid>
</UserControl>
让我为您解释一下代码。在DataTemplate
部分,我说我想用UserControl
ParameterView呈现ParameterViewModel类的对象。当为eac启动ItemsControl
时,我的ItemsSource
属性绑定到列表h ParameterViewModel在列表中,它将创建一个ParameterView,并将其DataContext设置为正在渲染的ParameterViewModel。
我发现这种体系结构模式对我构建WPF应用程序来说是最直观的。别傻了……只需使用数据模板……更简单更干净!:)我自己也尝试过,但是我可以完全根据自己的需要移动数据模板。DataTempalte是否由我们在示例中看不到的ParameterViewModel的内部访问?
<UserControl x:Class="Controls.StepView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:my="clr-namespace:Controls"
Background="Transparent">
<UserControl.Resources>
<DataTemplate DataType="{x:Type my:ParameterViewModel}" >
<my:ParameterView HorizontalAlignment="Stretch" Margin="25 0 0 0"/>
</DataTemplate>
</UserControl.Resources>
<Grid>
<ItemsControl Name="stkStepContent" ItemsSource="{Binding Parameters}" />
</Grid>
</UserControl>