C# 将集合绑定到Listbox

C# 将集合绑定到Listbox,c#,wpf,data-binding,C#,Wpf,Data Binding,我今天基本上是从WPF开始的,我对绑定的难度感到惊讶。我有一个文本框数组,在一个可观察集合中,我只想在我的列表框中绑定它,以便它们垂直排列 我已经摆弄这个三年了,你能帮忙吗 我在一个WPFUserControl,而不是许多教程所依赖的窗口中工作。在您的C代码中,您可以执行以下操作: myListBox.ItemsSource = myTextBoxesCollection; 或者在XAML代码中: <ListBox ItemsSource="{Binding MyTextBoxesCol

我今天基本上是从WPF开始的,我对绑定的难度感到惊讶。我有一个
文本框数组
,在一个
可观察集合
中,我只想在我的
列表框
中绑定它,以便它们垂直排列

我已经摆弄这个三年了,你能帮忙吗

我在一个WPF
UserControl
,而不是许多教程所依赖的窗口中工作。

在您的C代码中,您可以执行以下操作:

myListBox.ItemsSource = myTextBoxesCollection;
或者在XAML代码中:

<ListBox ItemsSource="{Binding MyTextBoxesCollection}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBox Text="{Binding Text}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
使MyTextBoxCollection(文本框的ObservableCollection)成为DataContext的公共属性

<ListBox ItemsSource=”{Binding MyTextBoxCollection}”>
  <ListBox.ItemTemplate>
    <DataTemplate><TextBox Text=”{Binding Text}” /></DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

拥有一个
可观察的集合
通常是错误的方法。您可能需要一个
可观察集合

然后,在列表框(或ItemsCollection)中,您有以下代码:

<ListBox ItemsSource="{Binding MyStrings}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBox Text="{Binding .}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>


我认为这行不通。例如,MyListBox应该是ListBox。为了回答您的怀疑,它不需要是依赖项属性。如果我这样做,它会告诉我:System.InvalidOperationException:Items集合在使用ItemsSource之前必须为空。即使我在添加文本框之前确实分配了它。当使用ItemsControl时,必须使用Items属性或ItemsSource属性,但不能同时使用这两个属性。请确保您没有这样设置列表框的内容:@Blurb:不过,我还是怀疑您为什么要创建文本框集合,然后将它们的文本属性绑定到列表框以创建新的文本框。这真的是你想要的吗?或者您想要一组字符串?请不要急于断定WPF/Silverlight中的数据绑定很困难。事实证明,每件事都有一个很好的押韵和理由,一旦你理解了范式,这其实很容易。这个范例当然有一条学习曲线,但一旦你得到它,你可能会觉得数据绑定是最棒的事情。。。世界比Winforms更好,但这并不是说:)在wpf中,您不需要创建文本框数组。只需定义包含文本框的模板并将其绑定到一个数据列表,
list。Count
会动态为您创建多个文本框。我认为您需要编辑问题以格式化
ObservableCollection
ObservableCollection
,因为第一行在其中没有任何意义。这不起作用。我已经用各种方法试过了。请自己创建一个WPF项目并尝试此操作。对不起。。。我错过了{Binding.}中的“.”嗯,似乎不起作用。我的列表框仅在一行中显示“System.Windows.DataTemplate”。我在UserControl构造函数中添加了这个:TextBox temp=new TextBox();temp.Text=“测试”;收集的气味添加(温度);以下错误:System.Windows.Data错误:40:BindingExpression路径错误:“在对象”“MyControl'(Name='Window')上找不到mycollection”属性。BindingExpression:Path=mycollection;DataItem='MyControl'(Name='Window');目标元素是'ListBox'(Name='Test2');目标属性是“ItemsSource”(类型为“IEnumerable”)@Blub:像这样更改ItemsSource
。用Brian的答案中的
包装
块。ListBox和DataTemplate之间缺少您。我仍然收到相同的错误,ListBox中没有显示任何内容。我还得到以下信息:System.Windows.Data错误:4:找不到用于绑定的源,引用为“RelativeSource FindAncestor,AncestorType='Microsoft.VisualStudio.PlatformUI.VsToolBar',AncestorLevel='1'。BindingExpression:Path=DataContext.DockLocation;DataItem=null;目标元素是“VsMenuItem”(名称=“”);目标属性为“NoTarget”(类型为“Object”)@Blub:你是什么意思?我的答案与公认的答案几乎相同。
<ListBox ItemsSource="{Binding MyStrings}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBox Text="{Binding .}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>