【问题标题】:WPF Listbox & MVVM bindingWPF 列表框和 MVVM 绑定
【发布时间】:2012-07-16 16:29:20
【问题描述】:

我在 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?

【问题讨论】:

    标签: wpf listbox datatemplate datacontext itemssource


    【解决方案1】:

    您已经知道答案:只需从您的 UserControl 中删除 &lt;UserControl.DataContext&gt;

    您告诉您的UserControlDataContext 使用CatelogueModel 的新实例,这会覆盖在您使用UserControl 时设置的任何DataContext。有关详细信息,请参阅 MSDN 的 Dependency Property Precedence 列表

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

    的人来说都是一个问题

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

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

    【讨论】:

    • 感谢回复,终于搞定了。我摆脱了 usercontrol.datacontext。我想在 usercontrol_loaded 方法中使用数据上下文中的信息。我只需要转换数据上下文即可将其取回(timmeh)。我只是觉得很奇怪,通过告诉视图它的数据上下文类型它只加载默认构造函数而不是加载在构造时给它的模型。
    • @user1444261 您的&lt;UserControl.DataContext&gt; 没有设置类型。它将实际的UserControl.DataContext 属性设置为CatelogueModel 的新实例。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-15
      • 2015-10-16
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      • 2021-10-11
      • 2015-07-11
      • 2015-04-27
      相关资源
      最近更新 更多