Невозможно установить привязку элемента UserControl в WPF

#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'».