【问题标题】:WPF Bind List to Multi-Column ListBoxWPF 将列表绑定到多列列表框
【发布时间】:2011-03-07 13:53:25
【问题描述】:

自从开始使用 WPF 以来,我仍然在努力理解数据绑定功能。

我正在尝试使用多列列表框,我的 XAMl 看起来像这样:

<ListBox Name="RecordList">
    <ListView Name="RecordListView">
        <ListView.View>
             <GridView>
                <GridView.Columns>
                     <GridViewColumn Header="1" Width="Auto" DisplayMemberBinding="{Binding Path=Field1}" />
                     <GridViewColumn Header="2" Width="50" DisplayMemberBinding="{Binding Path=Field2}" />
                     <GridViewColumn Header="3" Width="100" DisplayMemberBinding="{Binding Path=Field3}" />
                </GridView.Columns>
           </GridView>
      </ListView.View>
 </ListView>
</ListBox>

我只是无法正确使用 c# 代码来填充列表中的项目?

【问题讨论】:

    标签: wpf binding listbox multiple-columns


    【解决方案1】:

    简而言之,这就是它的组合方式。

    首先,您定义一个模型来保存您的数据以进行绑定。

    public sealed class MyListBoxItem
    {
      public string Field1 {get;set;}
      public string Field2 {get;set;}
      public string Field3 {get;set;}
    }
    

    现在,您必须有一个类来保存这些模型以进行绑定。这种类型通常称为 ViewModel;它根据来自视图的用户输入向视图提供信息以进行绑定。它的公共属性通常是 ObservableCollections 和 DependencyProperties,因此 ViewModel 中的更改将由 View(UI)自动获取:

    public sealed class MyViewModel
    {
      public ObservableCollection<MylistBoxItem> Items {get;private set;}
      public MyViewModel()
      {
        Items = new ObservableCollection<MyListBoxItem>();
        Items.Add(new MyListBoxItem{Field1="One", Field2="Two",Filed3="Three"};
      }
    }
    

    在 UI 的代码隐藏“视图”中,实例化 ViewModel 并将其设置为视图的 DataContext。

    public MyView()
    {
      this.DataContext = new MyViewModel();
    }
    

    这很重要,因为 DataContext 在可视化树中“流动”。它可用于设置它的每个子元素。

    为了显示项目,我必须将 ListView 的 ItemsSource 绑定到 DataContext 的 Items 属性(这个理解)。 ListView 中的每一行都将其 DataContext 设置为 Items 属性中的每个单独的 MyViewModel。因此,您必须将每个显示成员绑定到 MyListBoxItem 的属性。

    <ListView Name="RecordListView" ItemsSource="{Binding Items}">
        <ListView.View>
            <GridView>
                <GridView.Columns>
                    <GridViewColumn Header="1" Width="Auto" DisplayMemberBinding="{Binding Path=Field1}" />
                    <GridViewColumn Header="2" Width="50" DisplayMemberBinding="{Binding Path=Field2}" />
                    <GridViewColumn Header="3" Width="100" DisplayMemberBinding="{Binding Path=Field3}" />
                </GridView.Columns>
            </GridView>
        </ListView.View>
    </ListView>
    

    为了更好地了解整个过程,请在此处搜索标记为 [MVVM] 的高评分问题。

    另外,为了帮助调试您的绑定,请为详细数据绑定配置调试:

    【讨论】:

    • +1 非常具有描述性...当然有帮助。但我仍然建议打好基础,熟悉数据绑定和数据模板,然后选择 MVVM
    • 感谢您提供如此全面的答案,我创建了 ViewModel 并使其正常工作。有没有办法“刷新”事件中的 ViewModel / Items 列表,因为此代码已连接到数据库,因此会实时更新,我需要在屏幕上反映这些更改
    • @Matt 听起来您想在视图模型中创建一个DispatcherTimer。您可以响应其 Tick 事件并更新 ViewModel 的公共属性作为响应。您的属性必须通过 DependencyProperties、ObservableCollections 或实现 INotifyPropertyChanged 的​​ VM 传播更新通知。您还必须注意从后台线程更新 UI 的问题(Tick 事件不会在 UI 线程上触发)。所有这些主题都可以在这里搜索。
    • @biju 你是对的,当然。我确实认为 MVVM 模式对理解非常重要,在开发 WPF 应用程序时应该尽快学习。很多人从 winforms/webforms/没有背景来到 WPF,最终陷入代码隐藏地狱。单行 xaml 可能需要 20 行极其晦涩的代码才能完成;应该鼓励尽早避免这个陷阱。
    【解决方案2】:

    您不必同时使用列表框和列表视图。您可以将列表框与数据模板一起使用,也可以将列表视图与您的网格视图列一起使用。

    查看以下链接以了解如何正确填充列表框

    http://www.c-sharpcorner.com/uploadfile/mahesh/wpflistbox08252008100659am/wpflistbox.aspx

    http://www.wpftutorial.net/ListBoxDataTemplate.html

    http://www.codeproject.com/KB/WPF/CustomListBoxLayoutInWPF.aspx

    我强烈建议您通过以下链接,掌握 wpf 中的数据绑定和数据模板化的坚实基础

    http://msdn.microsoft.com/en-us/library/ms742521.aspx

    http://www.codeproject.com/KB/WPF/GuidedTourWPF_4.aspx

    http://www.wpftutorial.net/DataTemplates.html

    【讨论】:

    猜你喜欢
    • 2011-08-28
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    相关资源
    最近更新 更多