Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在WPF中使用数据绑定为列表中的每个元素创建新的用户控件?_C#_Wpf_User Controls_Binding - Fatal编程技术网

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

C# 如何在WPF中使用数据绑定为列表中的每个元素创建新的用户控件?,c#,wpf,user-controls,binding,C#,Wpf,User Controls,Binding,我有一个物品清单。对于列表中的每个项目,我想创建一个绑定到该项目的新用户控件。从我所读到的内容来看,以编程方式执行此操作对于WPF来说是一种糟糕的做法(而且不那么简单),因此我应该使用数据绑定作为解决方案。问题是,我不知道怎么做。在编译时我不知道列表的内容(只是类型),所以我不能为每个元素创建并绑定XAML。谷歌和MSDN似乎没有任何答案,所以也许我想得不对?我需要做什么 谢谢 编辑:为了澄清,我正在尝试制作我自己的音乐评分软件,比如玫瑰园。列表将包含所有度量值,用户控件将是它们的视觉表示。您可

我有一个物品清单。对于列表中的每个项目,我想创建一个绑定到该项目的新用户控件。从我所读到的内容来看,以编程方式执行此操作对于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>