将集合绑定到Listbox

3
我今天基本上开始使用WPF,我对绑定操作的困难感到惊讶。我有一个ObservableCollection中的TextBoxes数组,并且只想在我的Listbox中绑定它们,使它们垂直排列。
我已经尝试过三次了,你能帮忙吗?
我正在使用WPF UserControl而不是像很多教程中所依赖的窗口。

2
请不要轻易断定WPF/Silverlight中的数据绑定很难。事实证明,每件事情都有其道理和规律,一旦你理解了这个范例,它其实很容易掌握。当然,这个范式需要一定的学习曲线,但是一旦你掌握了它,你可能会觉得数据绑定是最棒的东西...比Winforms好多了,但这不值得一提 :) - Brian Genisio
2
在wpf中,您无需创建文本框数组。只需定义包含文本框的模板并将其绑定到数据列表,即可在飞行中为您创建 list.Count 个文本框。 - Amsakanna
3个回答

4
在您的C#代码中,您可以这样做:
myListBox.ItemsSource = myTextBoxesCollection;

或者在你的XAML代码中:

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

对于XAML,MyTextBoxesCollection需要成为您数据上下文中的公共属性。一种设置DataContext的方法可能是在构造函数中:

DataContext = this;

我认为这不会起作用。首先,MyListBox 应该是 ListBox。而且回答你的疑虑,它不需要成为一个依赖属性。 - Eric Mickelsen
如果我这样做,它会告诉我:System.InvalidOperationException: 在使用ItemsSource之前,项集合必须为空。 尽管在添加文本框之前我实际上已经分配了它。 - Blub
当使用ItemsControl时,必须同时使用Items属性或ItemsSource属性,不能同时使用两者。确保您不会像这样设置ListBox的内容: 并且确保您在代码后台中也没有向Items集合添加任何内容。 - Kelsie
@简介:尽管如此,我还是要问一下,为什么您要创建一个文本框集合,然后将它们的文本属性绑定到一个列表框上以创建新的文本框呢?这真的是您想要的吗?还是您想要一个字符串集合? - Brian Genisio

3

拥有一个 ObservableCollection<TextBox> 几乎总是错误的方法。相反,你可能需要一个 ObservableCollection<string>

然后,在你的 ListBox(或 ItemsCollection)中,你可以使用以下代码:

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

我认为你需要编辑你的问题,将ObservableCollection<TextBox>ObservableCollection<String>格式化,因为第一行没有意义。 - Amsakanna
这个不起作用。我已经以各种可能的方式尝试过了。请自己创建一个WPF项目并尝试一下。 - Blub
抱歉...我在{Binding .}中漏掉了'.'。 - Brian Genisio

1

将您的MyTextBoxCollection(Textboxes 的ObservableCollection)设置为DataContext的公共属性。

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

嗯,好像不起作用。我的列表框只在单独的一行中显示“System.Windows.DataTemplate”。虽然我是在UserControl构造函数中添加的: TextBox temp = new TextBox(); temp.Text = "Test"; collectedTodos.Add(temp); 以下错误信息:System.Windows.Data Error: 40 : BindingExpression path error: 'mycollection' property not found on 'object' ''MyControl' (Name='Window')'. BindingExpression:Path=mycollection; DataItem='MyControl' (Name='Window'); target element is 'ListBox' (Name='Test2'); target property is 'ItemsSource' (type 'IEnumerable') - Blub
@Blub:将ItemsSource更改为<ListBox ItemsSource =“{Binding collectedTodos}”>。像Brian的答案中那样用<ListBox.ItemTemplate>包装<DataTemplate> <TextBox Text =“{Binding Text}”/></ DataTemplate>块。 - Amsakanna
在 ListBox 和 DataTemplate 之间缺少 <ListBox.ItemTemplate>。 - Brian Genisio
我仍然收到相同的错误,列表框中也没有显示任何内容。我还收到了这些错误:System.Windows.Data Error: 4 : 找不到引用'RelativeSource FindAncestor, AncestorType='Microsoft.VisualStudio.PlatformUI.VsToolBar', AncestorLevel='1''的绑定源。BindingExpression:Path=DataContext.DockLocation; DataItem=null; target element is 'VsMenuItem' (Name=''); target property is 'NoTarget' (type 'Object')。 - Blub
@Blub:你是什么意思?我的答案几乎与被接受的答案相同。 - Eric Mickelsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接