![](/img/trans.png)
[英]How do I create a user control with 3 combo boxes and a different data binding for each?
[英]How can I use data binding in WPF to create a new user control for each element in a list?
我有一个对象列表。 对于列表中的每个项目,我想创建一个绑定到该项目的新用户控件。 根据我的阅读,以编程方式执行此操作是WPF的不良做法(并且不太直接),因此我应该使用数据绑定作为解决方案。 问题是,我无法弄清楚如何做到这一点。 我在编译时不知道列表的内容(只是类型),所以我无法为每个元素创建和绑定XAML。 谷歌和MSDN似乎没有任何答案,所以也许我正在考虑这个错误的方式? 我需要做什么?
谢谢
编辑:澄清一下,我正在尝试制作自己的音乐评分软件,比如Rosegarden。 该列表将包含所有度量,用户控件将是它们的可视化表示。
比Julien Lebosquain的建议更通用的方法(以及当项目列表包含多种数据类型的对象时将起作用的方法):
创建一个DataTemplate
,用于显示列表中的类型项,例如:
<DataTemplate DataType="local:Measure">
<local:MeasureUserControl DataContext="{Binding}"/>
</DataTemplate>
使用ItemsControl
来显示项目:
<ItemsControl ItemsSource="{Binding MeasureList}"/>
您可以设置ItemsPanel
的财产ItemsControl
到ItemsPanelTemplate
执政将如何布局的用户控件,例如:
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
这种方式一般最好使用一个ListBox
,当你不希望的功能ListBox
,例如它的默认边框和选择行为。
您可以使用具有自定义项样式的标准ListBox
:
在资源的某个地方:
<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>
在你的窗口/页面/ usercontrol中:
<ListBox ItemsSource="{Binding ...}" ItemContainerStyle="{StaticResource CustomItemStyle}" />
由于您的对象将绑定到列表框,因此将为每个对象创建一个隐式ListBoxItem
,并将其DataContext
设置为该对象,以便您可以在YourControl
使用绑定而不必担心。
所有上述答案都有效,但我将离开我在申请中的表现。 我正在实现利用这些WPF功能的MVVM架构。 这是我正在使用的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的对象。 ItemsControl
的ItemsSource
属性绑定到List<ParameterViewModel>
。 当为List上的每个ParameterViewModel启动ItemsControl
,它将创建一个ParameterView并将其DataContext设置为它正在呈现的ParameterViewmodel。 我发现这种架构模式对我来说是最直观的构建WPF应用程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.