在 WPF 中将列表框绑定到字符串类型的 Observable 集合

Posted

技术标签:

【中文标题】在 WPF 中将列表框绑定到字符串类型的 Observable 集合【英文标题】:Binding a listbox to an Observable Collection of type string in WPF 【发布时间】:2012-05-26 10:27:01 【问题描述】:

我正在尝试创建一个跟踪 JobItems 的应用程序。在应用程序中,用户单击“New Job”按钮以创建 JobItem。然后会弹出一个新窗口(NewJobWindow),用户必须填写有关 Job 的信息。一些所需的信息具有多个值。例如,您可以在一个工作项目中添加多个(字符串)业务单位。我所做的是添加一个列表框,供用户在其中添加所有业务单位。我不知道如何绑定这个业务单位列表框,这样每次我在其中添加一个项目时,当我单击提交按钮时,JobItem 中的 Observable Collection BusinessUnits 都会添加相同的项目。我需要知道如何使用数据绑定来做到这一点。我已经在 Google 上搜索过类似的答案,但没有找到。

编辑

这是我的 JobItem 类中的内容,每次用户在 NewJobWindow 中提交多个 BusinessUnit 时,我都需要更新它:

public ObservableCollection<string> BusinessUnit
    
        get  return businessUnit; 
        set
        
            if(!BusinessUnit.Equals(value))
            
                businessUnit = value;
                OnPropertyChanged("BusinessUnit");
            
        

    

这就是 xaml 中 JobWindow 的样子,用于在列表框中添加业务单元。我创建了一个 ValidatingListBox 只是为了验证用户是否在列表框中插入了一个项目。:

<Label Grid.Column="0" Grid.Row="5">Business Unit:</Label>
        <my:ValidatingListBox Grid.Column="1" Grid.ColumnSpan="1" Grid.Row="5" Grid.RowSpan="1" x:Name="businessUnitBox" SelectionMode="Multiple" SelectionChanged="ValidatingListBox_SelectionChanged" ItemsSource="Binding Path=BusinessUnit" >
        <my:ValidatingListBox.ValidationListener>
                <Binding RelativeSource="RelativeSource FindAncestor, AncestorType=Window" Path="BusinessUnit" Mode="TwoWay">
                <Binding.ValidationRules>
                    <my:ListBoxValidationRule ValidatesOnTargetUpdated="True" ></my:ListBoxValidationRule>
                </Binding.ValidationRules>
            </Binding>
        </my:ValidatingListBox.ValidationListener>
    </my:ValidatingListBox>

【问题讨论】:

【参考方案1】:

绑定很简单:

<ListBox ItemsSource="Binding MyCollection" />  

其中 MyCollection 是 ObservableCollection 类型的属性。您无需将项目添加到 ListBox,将它们添加到集合中,数据绑定将完成剩下的工作。

【讨论】:

用户需要一个 UI 来在窗口中添加业务单位,这就是为什么我需要在列表框中添加项目,然后需要更新对象中的集合。我将如何引用 JobItem 对象中的集合?请检查我的编辑,也许你会明白我正在努力做得更好。 @Erika,我强烈建议您阅读有关 MVVM 模式的信息。 UI 只是一个演示文稿。逻辑(即“添加业务单元”)必须驻留在视图模型中,而不是视图 (UI)。

以上是关于在 WPF 中将列表框绑定到字符串类型的 Observable 集合的主要内容,如果未能解决你的问题,请参考以下文章

WPF - 绑定到用户控件之间的列表框的选定项

如何在C#中将列表与WPF数据网格绑定?

如何将 DataGrid 中的文本框绑定到 Wpf 中的列表?

在 WinForms 中将 Listbox 绑定到 List<object>

将 ObservableCollection 绑定到 WPF 列表框

如何将字符串列表数据绑定到 WPF/WP7 中的 ListBox?