繁体   English   中英

如何在WPF中使用数据绑定为列表中的每个元素创建新的用户控件?

[英]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的财产ItemsControlItemsPanelTemplate执政将如何布局的用户控件,例如:

<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的对象。 ItemsControlItemsSource属性绑定到List<ParameterViewModel> 当为List上的每个ParameterViewModel启动ItemsControl ,它将创建一个ParameterView并将其DataContext设置为它正在呈现的ParameterViewmodel。 我发现这种架构模式对我来说是最直观的构建WPF应用程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM