2013-11-02 24 views
0

我是XAML,WPF和數據綁定的新品牌,所以這可能是一個愚蠢的問題。我有一個VM,帶有PurchaseTransactions集合的?我有一個視圖,通過Resource Dictionary來呈現ListView中集合中的每個PurchaseTransaction。我可以讓視圖在主窗口中呈現,但我沒有填充數據。DataTemplate View呈現但收集數據不是

視圖 - AllTransactionsView.Xaml:

<UserControl x:Class="BudgetApp.Views.AllTransactionsView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" d:DesignWidth="300" Height="97"> 
<UserControl.Resources> 
    <CollectionViewSource 
     x:Key="AllTrans" 
     Source="{Binding Path=AllTransactions}"/> 
</UserControl.Resources> 
<ListView 
    DataContext="{StaticResource AllTrans}" 
    ItemsSource="{Binding}" > 
    <ListView.View> 
     <GridView> 
      <GridViewColumn 
       Header="Name" 
       DisplayMemberBinding="{Binding Path=Name}" 
       Width="Auto"/> 
      <GridViewColumn 
       Header="Transaction Type" 
       DisplayMemberBinding="{Binding Path=TransactionType}" /> 
      <GridViewColumn 
       Header="Amount" 
       DisplayMemberBinding="{Binding Path=Amount}" 
       /> 
     </GridView> 
    </ListView.View> 
</ListView> 

的DataTemplate在MainWindowResoures.Xaml:

<ResourceDictionary 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:vm="clr-namespace:BudgetApp.ViewModels" 
xmlns:vw="clr-namespace:BudgetApp.Views"> 

<DataTemplate x:Key="allTransTemplate" DataType="{x:Type vm:AllTransactionViewModel}"> 
    <vw:AllTransactionsView/> 
</DataTemplate> 

<DataTemplate DataType="{x:Type vm:TransactionViewModel}"> 
    <vw:TransactionView /> 
</DataTemplate> 

MainWindow.XAML:

<Window x:Class="BudgetApp.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:vm="clr-namespace:BudgetApp.ViewModels" 
    xmlns:vw="clr-namespace:BudgetApp.Views" 
    Title="MainWindow" Height="590.717" Width="767.194"> 
<Window.Resources> 
    <ResourceDictionary Source="MainWindowResources.xaml"/> 
</Window.Resources> 
<Grid> 
    <ContentControl 
     Content="{Binding AllTransactions}" 
     ContentTemplate="{StaticResource allTransTemplate}"> 
    </ContentControl> 


</Grid> 

最後,AllTransactionViewModel類:

class AllTransactionViewModel: ViewModelBase 
{ 
    private BudgetEntities _context; 

    public AllTransactionViewModel() 
    { 
     _context = new BudgetEntities(); 
     AllTransactions = new ObservableCollection<TransactionViewModel>(); 
     GetAllTransactions(); 
    } 

    public void GetAllTransactions() 
    { 
     foreach (var transaction in _context.PurchaseTransactions) 
     { 
      AllTransactions.Add(new TransactionViewModel 
      (
       transaction.TransactionDate, 
       transaction.TransactionType.Description, 
       transaction.Name, 
       transaction.Memo, 
       (double)transaction.Amount, 
       transaction.IsApproved, 
       transaction.PurchaseType.Description 
      ) 
      ); 
     } 
    } 

    public ObservableCollection<TransactionViewModel> AllTransactions { get; private set; } 
} 

我在做什麼錯在這裏?

回答

1

首先,CollectionViewSource工作時,(上ListView)結合應該是:

ItemsSource="{Binding Source={StaticResource AllTrans}}" 

你不需要在這種情況下,數據上下文。如果你有比所示更多的代碼,而你真正需要的數據上下文然後離開項目來源,原來,而是改變數據方面:

DataContext="{Binding Source={StaticResource AllTrans}}" 

的原因「怪異」的結合使用是你真正需要CollectionViewSource.View作爲項目來源。當源對象是CVS並且它自動獲取視圖時,綁定具有特殊待遇。 StaticResource沒有特別處理,並且您不能使用{StaticResource AllTrans.View},因爲它意味着獲取AllTrans類型的屬性View中的密鑰,該類型不存在。

[作爲一個側面說明,也許DataContext="{StaticResource AllTrans}" ItemsSource="{Binding View}"會的工作,從來沒有嘗試過]

以上應填寫的項目,但我不知道將與數據模板與數據類型TransactionViewModel衝突發生什麼以及您在列上使用DisplayMemberBinding這一事實。這可能會混淆項目,但是您仍然應該能夠看到列表視圖中有一些項目。

+0

這正是發生了什麼事情。 8項(我的數據源中的記錄數量)顯示在列表視圖中,但沒有文本。我想我正在使用錯誤的控件。無論哪種方式,謝謝。你的解釋確實有幫助。 – MickJuice

+0

沒有數據顯示的原因是因爲我的對象屬性上沒有getter和setter ... – MickJuice