0

私は XAML、WPF、およびデータ バインディングにまったく慣れていないので、これはばかげた質問かもしれません。PurchaseTransactions のコレクションを持つ VM、AllTransactionViewModel があります。リソース ディクショナリを介して、コレクション内の各 PurchaseTransaction を ListView にレンダリングするビューがあります。ビューをメイン ウィンドウにレンダリングすることはできますが、データが入力されません。

表示 - 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>

MainWindowResoures.Xaml の DataTemplate:

<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; }
}

ここで何が間違っていますか?

4

1 に答える 1

1

まず、CollectionViewSourceバインディング ( on ListView) を使用する場合は次のようにする必要があります。

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

この場合、データ コンテキストは必要ありません。表示されているよりも多くのコードがあり、実際にデータ コンテキストが必要な場合は、アイテム ソースを元のままにして、代わりにデータ コンテキストを変更します。

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

「奇妙な」バインディングの使用の理由はCollectionViewSource.View、アイテムのソースとして実際に必要だからです。ソース オブジェクトが CVS であり、ビューを自動的に取得する場合、バインディングには特別な処理があります。StaticResourceには特別な扱いがなく、存在しない型の{StaticResource AllTrans.View}プロパティViewでキーを取得することを意味するため使用できません。AllTrans

[補足として、おそらくDataContext="{StaticResource AllTrans}" ItemsSource="{Binding View}"うまくいくかもしれませんが、試したことはありません]

上記は項目を埋めるはずですが、データテンプレートとデータ型の競合と、列でTransactionViewModel使用するという事実で何が起こるかわかりません. DisplayMemberBindingこれにより項目が乱れる可能性がありますが、それでもリスト ビューにいくつかの項目があることを確認できるはずです。

于 2013-11-04T17:53:34.857 に答える