3

我在 C# 中关注 MVVM 并尝试在列表框中显示视图。

我正在设置列表框项目源(在代码中,而不是在绑定和使用 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使用 的新实例CatelogueModelDataContext这会覆盖DataContext您使用UserControl. 有关更多信息,请参阅 MSDN 的Dependency Property Precedence列表

我不建议将DataContext内部设置为UserControl. 它与 WPF 的工作方式背道而驰,因为它具有单独的 UI 和数据层,并且对于任何尝试使用您的UserControl

至于您关于链接到 ItemsSource 的 ListBox 中的每个项目的问题,DataTemplates 只是告诉 WPF 如何绘制对象。对象背后的数据仍然存在。

例如,您的 ListBox 包含一个Record对象列表,并且您DataTemplate告诉 用ListBox绘制这些记录中的每一个CatelogueRowView。背后的实际数据CatelogRowView仍然是您的数据对象catelogueViewModel.Records

于 2012-07-16T18:10:49.727 回答
0

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

于 2012-07-16T16:37:45.727 回答