2011-03-07 61 views
1

从WPF开始,我仍然在努力理解数据绑定功能。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#代码吗?

回答

13

这是它组合在一起简而言之方式。

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

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

现在,你必须有一个持有这些模型进行绑定的类。这种类型通常称为ViewModel;它根据来自View的用户输入向View提供信息以进行绑定。它的公共属性通常ObservableCollections和DependencyProperties这样在视图模型的变化将通过视图(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并将其设置为View的DataContext。

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

这是非常重要的,因为DataContext通过可视化树“流动”。它可用于设置它的每个子元素。

要显示的项目,我必须绑定ListView中到DataContext的物品属性的的ItemsSource(这被理解)。 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]

此外,为帮助调试您的绑定,对于详细的数据绑定配置调试: Verbose databinding

+0

+1非常具有描述性......当然有帮助。但我仍然建议打下基础,熟悉数据绑定和数据模型,然后去MVVM – biju 2011-03-07 14:15:36

+0

感谢这样一个全面的答案,我创建了ViewModel并得到了这个工作。有没有办法刷新事件的ViewModel/Items列表,因为此代码连接到数据库,所以实时更新,我需要在屏幕上反映这些更改 – MattP 2011-03-07 14:49:39

+0

@Matt听起来像你想创建一个[ DispatcherTimer](http://msdn.microsoft.com/zh-cn/library/system.windows.threading.dispatchertimer.aspx)。您可以响应其Tick事件并更新ViewModel的公共属性作为响应。您的属性必须通过成为DependencyProperties,ObservableCollections或实现INotifyPropertyChanged的VM来传播更新通知。您还必须了解从后台线程更新UI的问题(Tick事件不会在UI线程上触发)。所有这些主题都可以在这里搜索。 – Will 2011-03-07 15:28:33

4

您不必同时使用listbox和listview。您可以使用带有数据模板的列表框或使用列表视图与gridviewcolumns。

检查下面的链接了解如何填充一个列表框正确

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

+2

并且还保持这种XAML结合的cheatsheet供参考:http://www.nbdtech.com/Free/WpfBinding.pdf – ShahidAzim 2011-03-07 14:06:37

+0

谢谢,那里有一些很好的阅读。感谢Shahid也提供了Cheatsheet。 – MattP 2011-03-07 14:36:22