#c# #wpf #wpf-controls
#c# #wpf #wpf-элементы управления
Вопрос:
Я работаю над приложением WPF и не хочу копировать / вставлять код. Я хочу повторно используемые элементы, как в React / JavaScript. В данном конкретном случае у меня есть DataGrid, который я хочу использовать в разных местах моего приложения с разными привязками / переменными. Я не хочу каждый раз копировать / вставлять DataGrid-XAML
Вот определение моего шаблона для моей сетки данных:
<Window.Resources>
<ControlTemplate x:Key="PersonTableTemplate" >
<DataGrid AutoGenerateColumns="False" Background="Transparent" RowBackground="Transparent" IsReadOnly="True" HeadersVisibility="Column">
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridRow}">
<Setter Property="Background" Value="#00000000" />
<Setter Property="Height" Value="30" />
<Setter Property="Foreground" Value="DarkGray" />
<Setter Property="FontSize" Value="18" />
</Style>
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="BorderThickness" Value="0" />
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
<Setter Property="HorizontalAlignment" Value="Right" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="#00000000" />
<Setter Property="Foreground" Value="DarkGray" />
</Trigger>
</Style.Triggers>
</Style>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="Background" Value="#FF151515" />
<Setter Property="Height" Value="30" />
<Setter Property="Foreground" Value="DarkGray" />
<Setter Property="FontFamily" Value="Maven Pro" />
<Setter Property="FontSize" Value="28" />
<Setter Property="HorizontalAlignment" Value="Right" />
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" Width="35" />
<DataGridTextColumn Header="Gender" Binding="{Binding Gender}" Width="100" />
<DataGridTextColumn Header="Age" Binding="{Binding Age}" Width="100" />
<DataGridTextColumn Header="Adress" Binding="{Binding Adress}" Width="100" />
</DataGrid.Columns>
</DataGrid>
</ControlTemplate>
</Window.Resources>
И в некоторых других местах я хочу использовать этот шаблон следующим образом:
<DataGrid DataContext="{Binding PersonTable}" ItemsSource="{Binding PersonsFromCanada}" Template="{StaticResource PersonTableTemplate}" />
<DataGrid DataContext="{Binding PersonTable}" ItemsSource="{Binding PersonsFromMexiko}" Template="{StaticResource PersonTableTemplate}" />
Но, к сожалению, это не работает, потому что таблица всегда пуста.
Если я помещу DataContext и ItemsSource непосредственно в шаблон, вот так…
<ControlTemplate x:Key="PersonTableTemplate" >
<DataGrid DataContext="{Binding PersonTable}" ItemsSource="{Binding PersonsFromCanada}" AutoGenerateColumns="False" Background="Transparent" RowBackground="Transparent" IsReadOnly="True" HeadersVisibility="Column">
...
…тогда таблица не пуста, но (очевидно) всегда имеет одно и то же содержимое.
Как я могу передать различные переменные PersonsFromCanada и PersonsFromMexiko в шаблон?
Комментарии:
1. Вы должны установить datacontext в своем коде, теперь ваш набор для Datacontext не работает.
2. Это не то, что означает шаблон в XAML. Я думаю, что вам здесь нужен UserControl, который содержит DataGrid. Кроме того, не рекомендуется явно устанавливать DataContext в XAML (и вопреки вышесказанному, еще хуже устанавливать DataContext явно в codebehind).
PersonTable
Есть ли свойство (не поле) с именемPersonsFromCanada
? Понятия не имея, как выглядит ваша фактическая viewmodel, я не могу сказать вам, как должны выглядеть ваши привязки.3. Большую часть этого можно было бы сделать, просто используя стиль (или 3), а не шаблон.
4. Или вы могли бы вставить часть между тегами datagrid в usercontrol. Привязать его itemssource к некоторому свойству — скажем, genericNamedCollection. Затем укажите это свойство в datacontext, где вы его используете. Я думаю, что создание шаблона для такой сетки данных является ошибкой.
5. Если я воспользуюсь вашим предложением, то получу «Не удается найти статический элемент ‘ItemsSourceProperty’ для типа ‘Control'».