我有一个雇员实体列表,绑定到实现DataTemplate的列表框。
的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的viewModel,它包含员工的集合。这种绑定工作正常,员工得到展示,一切都很好。问题是EmployeeViewModel继承自包含名为Language的静态属性的基本抽象ViewModel。这个模型有各种字段,我将标签绑定到整个应用程序。数据模板中的值不起作用。为什么呢?
其他信息:此列表框位于mainwindow.xaml
上的用户控件中编辑:
xmlns:viewModels="clr-namespace:POC.DesktopClient.ViewModels"
mc:Ignorable="d"
d:DataContext="{d:DesignInstance viewModels:EmployeeViewModel}"
我的usercontrol顶部的这些XML命名空间在绑定时允许xaml intelisense。知识确实会获取语言对象及其中的字段。
答案 0 :(得分:2)
正如您所说,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。