Данные времени разработки WPF XAML — устанавливают значение свойства для связанной модели

#c# #wpf #xaml #design-time-data

#c# #wpf #xaml #данные времени разработки

Вопрос:

Допустим, у нас есть модель Person:

 public class Person
{
    public long Id { get; set; }
    public string Name { get; set; }
    public City City { get; set; }
}
 

И у нас есть модель города:

 public class City
{
    public long Id { get; set; }
    public long ZipCode { get; set; }
    public string Name { get; set; }
}
 

Тогда у нас есть представление WPF / XAML, подобное этому:

 <Window
x:Class="WpfIssues.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfIssues"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<ItemsControl Margin="20">
    <d:ItemsControl.ItemsSource>
        <x:Array Type="{x:Type local:Person}">
            <local:Person Name="Thomas" Id="1" />
        </x:Array>
    </d:ItemsControl.ItemsSource>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="20" />
                    <ColumnDefinition Width="150" />
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0" Text="{Binding Id}" />
                <TextBlock Grid.Column="1" Text="{Binding Name}" />
            </Grid>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
 

Все это дает мне представление ItemsControl во время разработки с одним элементом Person.

Но я не могу понять, как установить значения свойств времени разработки для свойства City класса Person — например, ZipCode и City?

Кто-нибудь?

Ответ №1:

вы можете использовать синтаксис тегов:

 <local:Person Name="Thomas" Id="1">
  <local:Person.City>
    <local:City Id="10" ZipCode ="zip"/>
  </local:Person.City>
</local:Person>
 

или синтаксический синтаксис с ресурсом (как правило, это менее практично со значениями только для времени разработки)

 <ItemsControl Margin="20">
    <ItemsControl.Resources>
        <local:City Id="10" ZipCode ="zip" x:Key="City10"/>
    </ItemsControl.Resources>
    <d:ItemsControl.ItemsSource>
        <x:Array Type="{x:Type local:Person}">
            <local:Person Name="Thomas" Id="1" City="{StaticResource City10}"/>
        </x:Array>
    </d:ItemsControl.ItemsSource>
 

Ответ №2:

Это типично — через 10 секунд после публикации в SO — я нахожу решение:

 <Window
x:Class="WpfIssues.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfIssues"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<ItemsControl Margin="20">
    <d:ItemsControl.ItemsSource>
        <x:Array Type="{x:Type local:Person}">
            <local:Person Name="Thomas" Id="1">
                <local:Person.City>
                    <local:City Name="Holte" />
                </local:Person.City>
            </local:Person>
        </x:Array>
    </d:ItemsControl.ItemsSource>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="20" />
                    <ColumnDefinition Width="150" />
                    <ColumnDefinition Width="150" />
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0" Text="{Binding Id}" />
                <TextBlock Grid.Column="1" Text="{Binding Name}" />
                <TextBlock Grid.Column="2" Text="{Binding City.Name}" />
            </Grid>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>