【问题标题】:Listbox DataTemplate field binding isn't working列表框数据模板字段绑定不起作用
【发布时间】:2014-04-04 11:21:17
【问题描述】:

我有一个员工实体列表,绑定到一个实现 DataTemplate 的列表框。

数据模板:

<DataTemplate x:Key="EmployeeTemplate">
 <Grid>
  <Grid.ColumnDefinitions>
   <ColumnDefinition Width="*"/>
   <ColumnDefinition Width="*"/>
  </Grid.ColumnDefinitions>
  <StackPanel Grid.Column="0" Orientation="Vertical" 
              VerticalAlignment="Top" Margin="2">
   <TextBlock Foreground="Black" FontSize="12"
              VerticalAlignment="Bottom" Text="{Binding Path=Test}">
   </TextBlock>
   <TextBlock Foreground="Black" FontSize="12"
              VerticalAlignment="Bottom" Text="{Binding Path=Language.ContactNumber}">
   </TextBlock>
  </StackPanel>
  <StackPanel Grid.Column="1" Orientation="Vertical" 
              VerticalAlignment="Top" Margin="2">
   <TextBlock Foreground="Black" FontSize="12"
              VerticalAlignment="Bottom" Text="{Binding Path=IdNumber}">
   </TextBlock>
   <TextBlock Foreground="Black" FontSize="12"
              VerticalAlignment="Bottom" Text="{Binding Path=ContactNumber}">
   </TextBlock>
  </StackPanel>
 </Grid>
</DataTemplate>

列表框:

<ListBox ItemsSource="{Binding Path=Employees}"  
         x:Name="ListBoxEmployees" 
         ItemTemplate="{DynamicResource EmployeeTemplate}" 
         BorderBrush="DarkGray" 
         Margin="5"/>

我的 Datacontext 是一个名为 EmployeeViewModel 的视图模型,它包含员工的集合。这种绑定工作正常,员工得到展示,一切都很好。问题是 EmployeeViewModel 继承自包含名为 Language 的静态属性的基本抽象 ViewModel。这个模型有各种字段,我将标签绑定到整个应用程序。数据模板中的值不起作用。为什么?

附加信息:此列表框位于 mainwindow.xaml 上的用户控件中

编辑:

 xmlns:viewModels="clr-namespace:POC.DesktopClient.ViewModels"
        mc:Ignorable="d"
        d:DataContext="{d:DesignInstance viewModels:EmployeeViewModel}"

我的用户控件顶部的这些 XML 命名空间在绑定时允许 xaml 智能感知。智能确实拾取了语言对象及其内部的字段。

【问题讨论】:

  • 也许你应该绑定到静态资源,检查这个stackoverflow.com/a/3862828/67505
  • 尝试像“{Binding Source={StaticResource mvvm},Path=SelectedItem}”一样绑定
  • 喜欢:
  • @Nomi 产生此错误:“资源“语言”无法解析。”
  • @Swifty 你必须在上面添加抽象视图模型类的引用,并在 xaml 的 中设置语言类对象,然后你才能解决这个错误。

标签: wpf mvvm


【解决方案1】:

正如您所说,Language 属性位于 ViewModel 类中。但是将它放在DataTemplate 中会使其在 Employee 类中而不是在您的 ViewModel 中进行搜索。

您需要访问 ListBox 的 DataContext,您可以使用 RelativeSource

<TextBlock Text="{Binding Path=DataContext.Language.ContactNumber,
      RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBox}}"/>

更新

评论:

绑定使用这个可以正确解析,但它仍然没有更新 当我更改语言模型时。

首先要在 GUI 上更新实例属性,您需要在 ViewModel 类上实现 INotifyPropertyChanged

但是,这不适用于静态属性。对于要在 GUI 上更新的静态属性,您必须将它们重新绑定到 WPF 4.5。如果您使用的是 WPF 4.5,则可以使用 StaticPropertyChanged。详情请参考这里WPF 4.5 binding and change notification for static properties

【讨论】:

  • 绑定使用这个可以正确解析,但是当我更改语言模型时它仍然没有更新。
  • 显然我正在运行 WPF v3.0。如何更新到最新版本?为什么不捆绑VS2013 Ultimate?
  • 就像我在早期版本中提到的,您必须手动更新 GUI 组件,或者您必须使其成为实例属性。
  • 能否请您使用手动选项指导我,因为实例属性似乎只能使用 WPF4.5
猜你喜欢
  • 2013-02-23
  • 2014-01-13
  • 1970-01-01
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多