我有一个普通的“ Location”对象,其中包含要显示的字符串属性(城市,国家/地区,邮政编码等)的列表,位于属性名称的标题下方。我现在拥有的东西可以正常工作,并且看起来像这样:
<TextBlock Text="City" Style="{StaticResource HeaderStyle}" />
<TextBlock Text="{Binding City}" />
<TextBlock Text="Country" Style="{StaticResource HeaderStyle}" />
<TextBlock Text="{Binding Country}" />
…等。标头文本恰好与属性路径相同,并且自然地,我想避免重复编写所有这些对TextBlocks,而是使用ItemsControl和DataTemplates。
我已经在Window.Resources中定义了一个字符串列表,并且有一个ItemsControl至少正确显示了标题,但是我不能使用动态值作为绑定路径:
<Window.Resources>
<x:Array x:Key="LocationKeys" Type="sys:String">
<sys:String>City</sys:String>
<sys:String>Country</sys:String>
<sys:String>Zip</sys:String>
</x:Array>
</Window.Resources>
...
<ItemsControl ItemsSource="{StaticResource LocationKeys}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding}" Style="{StaticResource HeaderStyle}" />
<TextBlock Text="{Binding Path={Obviously I can't do this}}" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl>
太近了!我无法撼动自己在这里缺少某些东西的感觉,而且在查找术语以寻找同样问题的人方面遇到了很多麻烦-到目前为止,我对“动态绑定路径”的所有关注'等通常试图解决另一个完全不同的问题。
我想念一些简单的事情吗?有更好的方法吗?
答案 0 :(得分:0)
您的视图模型可能包含类似的字典
public class ViewModel
{
public Dictionary<string, object> Locations { get; }
= new Dictionary<string, object>();
}
您将像这样绑定到的
<ItemsControl ItemsSource="{Binding Locations}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Key}" Width="100"/>
<ContentControl Content="{Binding Value}"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>