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