Что касается вашего первого вопроса, это, вероятно, шаблон, который вы ищете:
<ItemsControl>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="100"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="50"/>
<RowDefinition Height="50"/>
<RowDefinition Height="50"/>
</Grid.RowDefinitions>
</Grid>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<Button Grid.Row="1" Grid.Column="2">R1C2</Button>
<Button Grid.Row="2" Grid.Column="1">R2C1</Button>
<Button Grid.Row="0" Grid.Column="0">R0C0</Button>
</ItemsControl>
В реальном приложении вы должны установить ItemsControl.ItemsSource
на Binding
, источник которогоколлекцию объектов, а затем создайте DataTemplate
, например:
<DataTemplate DataType="{x:Type MyObject}">
<Rectangle Grid.Row="{Binding Row}" Grid.Column="{Binding Column}">
<!-- other visuals go here -->
</Rectangle>
</DataTemplate>
Что касается организации кода в отдельных файлах: вам следует рассмотреть возможность создания UserControl
для отображения объекта вместоDataTemplate
.Создать один не сложнее, чем другой, и UserControl
- это классы, которые живут в своих собственных файлах XAML и могут быть созданы в XAML, как и любой другой объект, по имени.
В зависимости от вашегодизайн, вы можете отделить расположение сетки от фактического визуального представления объекта, чтобы вы могли использовать презентацию в другом месте.Наверное, так я и подхожу.После создания UserControl
для моего объекта я бы создал DataTemplate
в Grid.Resources
(поскольку он описывает, как этот конкретный Grid
должен отображать объекты), например:
<DataTemplate DataType="{x:Type MyObject}">
<DockPanel Grid.Row="{Binding Row}" Grid.Column="{Binding Column}">
<local:MyObjectUserControl DataContext="{Binding}"/>
</DockPanel>
</DataTemplate>
Этотакже возможно организовать XAML с использованием подхода, подобного включенному: создать автономный файл XAML, содержащий словарь ресурсов, а затем объединить словари в словарь ресурсов вашего окна (или приложения, или чего-либо еще):
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="myresourcedictionary.xaml"/>
<ResourceDictionary Source="myresourcedictionary2.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
Это может быть хорошим подходом для организации большого количества стилей и шаблонов, хотя проблема в том, что если установлено ResourceDictionary.MergedDictionaries
, вы не можете помещать какие-либо элементы непосредственно в словарь, поэтому вам нужно создать отдельныйXAML-файл, содержащий ресурсы, которые принадлежат только окну, что является своего рода болью.