首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在WPF中使用数据绑定为列表中的每个元素创建新的用户控件?

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

Stack Overflow用户
提问于 2010-05-31 05:10:06
回答 3查看 3.6K关注 0票数 4

我有一个对象列表。对于列表中的每一项,我想创建一个绑定到该项的新用户控件。据我所知,使用WPF以编程方式完成此操作是不好的做法(也不是很简单),因此我应该使用数据绑定作为解决方案。问题是,我不知道该怎么做。我不知道编译时列表的内容(只知道类型),所以我不能为每个元素创建和绑定XAML。Google和MSDN似乎没有任何答案,所以也许我想错了?我该怎么办?

谢谢

编辑:为了澄清,我正在尝试制作自己的音乐评分软件,就像Rosegarden一样。该列表将包含所有度量,而用户控件将是它们的可视化表示。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-05-31 18:21:01

一种比Julien Lebosquain的建议更通用的方法(当项目列表包含多种数据类型的对象时,该方法将有效):

创建用于显示列表中类型的项目的DataTemplate,例如:

代码语言:javascript
运行
复制
<DataTemplate DataType="local:Measure">
   <local:MeasureUserControl DataContext="{Binding}"/>
</DataTemplate>

使用ItemsControl显示以下项目:

代码语言:javascript
运行
复制
<ItemsControl ItemsSource="{Binding MeasureList}"/>

您可以将ItemsControlItemsPanel属性设置为ItemsPanelTemplate,以控制它将如何布局用户控件,例如:

代码语言:javascript
运行
复制
<ItemsControl.ItemsPanel>
   <ItemsPanelTemplate>
      <StackPanel Orientation="Horizontal"/>
   </ItemsPanelTemplate>
</ItemsControl.ItemsPanel>

当你不需要ListBox的功能时,这种方法通常比使用ListBox更可取,比如它的默认边框和选择行为。

票数 5
EN

Stack Overflow用户

发布于 2010-05-31 05:18:58

您可以将标准ListBox与自定义项目样式一起使用:

在资源中的某个位置:

代码语言:javascript
运行
复制
<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>

在您的窗口/页面/用户控件中:

代码语言:javascript
运行
复制
<ListBox ItemsSource="{Binding ...}" ItemContainerStyle="{StaticResource CustomItemStyle}" />

由于您的对象将被绑定到列表框,因此将为每个对象创建一个隐式ListBoxItem,并将其DataContext设置为该对象,因此您可以在YourControl中使用绑定,而无需担心。

票数 4
EN

Stack Overflow用户

发布于 2010-05-31 18:44:40

上面所有的答案都是有效的,但我将在我的应用程序中讨论如何做到这一点。我正在实现MVVM架构,它利用了这些WPF特性。这是我正在使用的一个UserControl,它有一个用某种类型的项填充的ItemsControl

代码语言:javascript
运行
复制
<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>。当为列表中的每个ParameterViewModel启动ItemsControl时,它将创建一个ParameterView,并将其DataContext设置为它正在呈现的ParameterViewmodel。我发现这个架构模式对我来说是构建WPF应用程序最直观的方式。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2940328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档