2012-07-16 85 views
3

我在C#中关注MVVM,并试图在列表框中显示一个视图。WPF列表框与MVVM绑定

我设置listbox itemsource(在代码中,而不是在绑定和使用viewmodels集合),然后将数据模板设置为我在xaml中的视图。我遇到的问题是我的视图总是加载其默认的构造函数值,如果我从视图中删除datacontext,但它加载正常。

下面是我在XAML

<ListBox Name="lbCatalogues" HorizontalContentAlignment="Stretch"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
       <view:CatalogueRowView/> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
</ListBox> 

创建这是我的看法的XAML列表框。如果我删除的DataContext它的工作原理

<UserControl.DataContext> 
    <model:CatalogueModel /> 
</UserControl.DataContext> 

    <Grid Name="Container" > 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="50" /> 
     <ColumnDefinition Width="100" /> 
     <ColumnDefinition Width="100" /> 
     <ColumnDefinition Width="1*" /> 
     <ColumnDefinition Width="40" /> 
    </Grid.ColumnDefinitions> 
    <!-- Catalogue_ID, UploadedTime, Client_ID, Name, Desc, Filesize --> 
    <Label Name="lblCatalogueID" Content="{Binding Path=CatalogueID}" Grid.Column="0"/> 
    <Label Name="lblUploadedTime" Content="{Binding Path=UploadedTime}" Grid.Column="1"/> 
    <Label Name="lblCatalogueName" Content="{Binding Path=Name}" Grid.Column="2"/> 
    <Label Name="lblCatalogueDescription" Content="{Binding Path=Description}" Grid.Column="3"/> 
    <Label Name="lblFilesize" Content="{Binding Path=Filesize}" Grid.Column="4"/> 
    <Grid/> 

这是我设置列表框的ItemSource代码:

lbCatalogues.ItemsSource = catalogueViewModel.Records;

我的问题是如何获得的视图列表框中正确加载以便列表框中的每个项目都有一个链接到该列表框Itemsource的DataContext?

回答

0

lbCatalogues.ItemsSource = catalogueViewModel.Records;而不是这样简单地将ListBox的ItemsSource绑定为xaml中的ItemsSource =“{Binding Records}”。我希望这将有所帮助。

4

你已经知道了答案:简单地从你的UserControl

删除<UserControl.DataContext>你告诉你的UserControl使用的CatelogueModel一个新的实例为DataContext,这将覆盖当您使用设置任何DataContextUserControl。有关详细信息,请参阅MSDN的Dependency Property Precedence列表

我从未建议将DataContext设置为UserControl的内部。它违背了WPF如何通过单独的UI和数据层来工作,并且对于任何试图使用你的人来说都是一个问题。至于你关于链接到ItemsSource的ListBox中的每个项目的问题,DataTemplates简单地告诉WPF如何绘制一个对象。对象背后的数据仍然存在。

例如,您的列表框包含Record对象的列表,你的DataTemplate是告诉ListBox绘制这些记录每一个与CatelogueRowViewCatelogRowView背后的实际数据仍然是您的数据对象catelogueViewModel.Records

+0

感谢您的回复,最终我得到了它的工作。我摆脱了usercontrol.datacontext。我想在usercontrol_loaded方法的datacontext中使用信息。我只需要投入datacontext就可以取回它(timmeh)。我觉得奇怪的是,通过告诉视图它的datacontext类型,它只加载默认的构造函数,而不是加载在构建时赋予它的模型。 – Brett 2012-07-17 09:04:45

+0

@ user1444261你的''没有设置类型。它将实际的'UserControl.DataContext'属性设置为'CatelogueModel'的新实例。 – Rachel 2012-07-17 11:59:31