3

C# で MVVM に従っており、リストボックスにビューを表示しようとしています。

リストボックスの itemsource を (viewmodels コレクションをバインドして使用するのではなく、コードで) 設定し、データテンプレートを xaml のビューに設定します。私が遭遇している問題は、ビューからデータコンテキストを削除すると、ビューが常にデフォルトのコンストラクター値でロードされることですが、正常にロードされます。

以下は、私が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 を持つように、ビューをリストボックス内に正しくロードするにはどうすればよいですか?

4

2 に答える 2

4

あなたはすでに答えを知っています<UserControl.DataContext>:UserControl

UserControlの新しいインスタンスを使用するように指示しています。これCatelogueModelは、 を使用するときに設定されたものをDataContextオーバーライドします。詳細については、MSDN の依存関係プロパティの優先順位のリストを参照してください。DataContextUserControl

DataContext内部に aを設定することはお勧めしませんUserControl。これは、UI レイヤーとデータ レイヤーを分離することで WPF が機能する方法に反しており、WPF を使用しようとする人にとっては問題です。UserControl

ItemsSource にリンクする ListBox 内の各項目に関する質問については、DataTemplates は WPF にオブジェクトの描画方法を伝えるだけです。オブジェクトの背後にあるデータはまだ残っています。

たとえば、ListBox にはRecordオブジェクトのリストが含まれており、でそれらのレコードのそれぞれを描画するようにDataTemplate指示しています。の背後にある実際のデータは、まだあなたのデータオブジェクトですListBoxCatelogueRowViewCatelogRowViewcatelogueViewModel.Records

于 2012-07-16T18:10:49.727 に答える
0

lbCatalogues.ItemsSource = catalogueViewModel.Records; この代わりに、xaml で ListBox の ItemsSource を ItemsSource="{Binding Records}" としてバインドするだけです。これが役立つことを願っています。

于 2012-07-16T16:37:45.727 に答える