WPF привязка к значению из моего DataContext - PullRequest
0 голосов
/ 26 марта 2019

У меня есть простой объект «Location» со списком строковых свойств (City, Country, Zip и т. Д.), Которые я хочу отобразить под заголовками имени свойства.То, что у меня сейчас работает, выглядит так:

<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>

Так близко!Я не могу избавиться от ощущения, что мне здесь чего-то не хватает, и у меня достаточно проблем с поиском терминов для поиска, чтобы найти кого-то с той же проблемой - все попадания, которые я получаю до сих пор для «Динамического пути привязки»и т. д. обычно пытаются решить другую, совершенно иную проблему.

Я что-то упустил?Есть ли лучший способ?

1 Ответ

0 голосов
/ 26 марта 2019

Ваша модель представления может содержать словарь типа

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...