2012-07-16 119 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