Шаблоны WPF. Селектор шаблонов не получает элемент - PullRequest
0 голосов
/ 06 мая 2020

Моя текущая проблема в том, что у меня есть два шаблона, которые нужно выбрать с помощью селектора шаблонов. Я определил две таблицы данных. Каждый из них содержит разные stackPanel, разные в том смысле, что количество содержащихся элементов различается.

Но в моем Селекторе шаблонов я не могу выбрать один из шаблонов, потому что элемент, переданный методу SelectTemplate, всегда имеет значение null.

Я полагаю, я не понял, как шаблоны работают в wpf. Примеры, которые вы видите на микросфтах

Здесь вы можете увидеть, как я определил свои таблицы данных


 <UserControl.Resources>
        <DataTemplate x:Key="Any">
            <StackPanel Orientation="Vertical">
                 <Label>Test</Label>
                 <Label>Test</Label>
            </StackPanel>
        </DataTemplate>
        <DataTemplate x:Key="Non" >
            <StackPanel Orientation="Vertical">
                <Label>Test</Label>
            </StackPanel>
        </DataTemplate>

        <selector:HeaderSelector 
            x:Key="ContentSelector"
            AnyTemplate="{StaticResource Any}"
            NonTemplate="{StaticResource Non}"/>

</UserControl.Resources>

Пользовательский элемент управления определяет ScrollView. В этом ScrollVewi я разместил ContentPresenter, который, в свою очередь, использует мой селектор шаблонов.

<ScrollViewer VerticalScrollBarVisibility="Auto" >
       <ContentPresenter 
           ContentTemplateSelector="{StaticResource ContentSelector}" 
           DataContext="{Binding ElementName=MyProductFilerView, Path=HasAny}" 
          />

    </ScrollViewer>

Вызывается селектор. Моя точка останова поражена. но параметр item метода SelectTemplate всегда равен нулю. Поэтому я не могу решить, какой шаблон выбрать.

public class  Selector : DataTemplateSelector
    {
        public DataTemplate NonTemplate { get; set; }
        public DataTemplate  AnyTemplate { get; set; }



        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            switch (item)
            {

                default:
                    return base.SelectTemplate(item, container);
            }

        }
    }
  • Не могли бы вы объяснить, почему в моем примере элемент всегда равен нулю?
  • И может быть, опишите, что нужно сделать для заполнения элемента значением?

1 Ответ

0 голосов
/ 07 мая 2020

Вместо привязки или установки свойства DataContext для ContentPresenter, вы должны использовать свойство Content:

 <ContentPresenter 
       ContentTemplateSelector="{StaticResource ContentSelector}" 
       Content="{Binding ElementName=MyProductFilerView, Path=HasAny}" />

Вы можете привязать Content непосредственно к DataContext вот так:

<ContentPresenter 
       ContentTemplateSelector="{StaticResource ContentSelector}" 
       DataContext="{Binding ElementName=MyProductFilerView, Path=HasAny}"
       Content="{Binding} "/>
...