none
WPF DataTemplate RRS feed

  • Вопрос

  • Необходимо сделать что бы при использовании DataTemplate шаблон выбирался исходя из типа данных, но задавался вот так: 

    <local:ItemsControlDragDropDecorator DataTemplate="{StaticResource DragTemplate}">

     Пробовал вот так сделать, не работает.

    <DataTemplate x:Key="DragTemplate">
       <DataTemplate.Resources>
          <DataTemplate DataType="{x:Type vm:Type1}">
            ...
          </DataTemplate>
          <DataTemplate DataType="{x:Type vm:Type2}">
             ...                            
          </DataTemplate>
       </DataTemplate.Resources>
    </DataTemplate>
    
    


    Как это правильно решается?

     


    • Изменено skysniper777 27 декабря 2011 г. 11:26
    27 декабря 2011 г. 11:25

Ответы

  • А что мешает тогда засунуть шаблоны в ресурсы декоратора?

    Кстати, у ContentPresenter-а тоже ведь есть стиль, можете передавать стиль, если не хотите пользоваться ресурсами декоратора.

    <local:ItemsControlDragDropDecorator>
         <local:ItemsControlDragDropDecorator.Resources>
            <DataTemplate DataType="{x:Type vm:Type1}"> ... </DataTemplate>
            <DataTemplate DataType="{x:Type vm:Type2}"> ... </DataTemplate>
         </local:ItemsControlDragDropDecorator.Resources>
    </local:ItemsControlDragDropDecorator>

    • Изменено Anton.MaksimovEditor 27 декабря 2011 г. 13:35
    • Предложено в качестве ответа Abolmasov Dmitry 28 декабря 2011 г. 6:11
    • Помечено в качестве ответа skysniper777 28 декабря 2011 г. 11:06
    27 декабря 2011 г. 13:32
    Отвечающий
  • Если кому интересно, сделал в итоге вот так:

    <Style x:Key="DragStyle">
    <Style.Resources>
    	<DataTemplate DataType="{x:Type Type1}">
    
    ...
    	</DataTemplate>
    	<DataTemplate DataType="{x:TypeType2}">
    ...
    	</DataTemplate>
    </Style.Resources>
    </Style> 
    
    <local:ItemsControlDragDropDecorator MyDragStyle="{StaticResource DragStyle}">

     

            public DragAdorner(object data, Style dragStyle, UIElement adornedElement, AdornerLayer adornerLayer)
                : base(adornedElement)
            {
                _adornerLayer = adornerLayer;
                _contentPresenter = new ContentPresenter() { Content = data, Style = dragStyle, Opacity = 0.75 };
    
                _adornerLayer.Add(this);
            }

     

    • Изменено skysniper777 28 декабря 2011 г. 11:12
    • Помечено в качестве ответа skysniper777 28 декабря 2011 г. 11:13
    28 декабря 2011 г. 11:10

Все ответы

  • Вынесите в ресурсы стиля, а не в шаблон.
    27 декабря 2011 г. 12:48
    Отвечающий
  • Не совсем понял как это сделать.


    Кажется понял, я забыл уточнить что в <local:ItemsControlDragDropDecorator DataTemplate="{StaticResource DragTemplate}">

    DataTemplate является DependencyProperty типа: 

    DataTemplateProperty = DependencyProperty.Register("DataTemplate", typeof(DataTemplate), typeof(ItemsControlDragDropDecorator), new FrameworkPropertyMetadata(null));

    В итоге он используется вот так:

            public DragAdorner(object data, DataTemplate dataTemplate, UIElement adornedElement, AdornerLayer adornerLayer)
                : base(adornedElement)
            {
                _adornerLayer = adornerLayer;
                _contentPresenter = new ContentPresenter()
                    { Content = data, ContentTemplate = dataTemplate, Opacity = 0.75 };
    
                _adornerLayer.Add(this);
            }

     

    Т.е. мне нужно чтобы был тип DataTemplate.
     Кроме стилей существует еще решение в данном случае?

     

    • Изменено skysniper777 27 декабря 2011 г. 13:28
    27 декабря 2011 г. 13:10
  • А что мешает тогда засунуть шаблоны в ресурсы декоратора?

    Кстати, у ContentPresenter-а тоже ведь есть стиль, можете передавать стиль, если не хотите пользоваться ресурсами декоратора.

    <local:ItemsControlDragDropDecorator>
         <local:ItemsControlDragDropDecorator.Resources>
            <DataTemplate DataType="{x:Type vm:Type1}"> ... </DataTemplate>
            <DataTemplate DataType="{x:Type vm:Type2}"> ... </DataTemplate>
         </local:ItemsControlDragDropDecorator.Resources>
    </local:ItemsControlDragDropDecorator>

    • Изменено Anton.MaksimovEditor 27 декабря 2011 г. 13:35
    • Предложено в качестве ответа Abolmasov Dmitry 28 декабря 2011 г. 6:11
    • Помечено в качестве ответа skysniper777 28 декабря 2011 г. 11:06
    27 декабря 2011 г. 13:32
    Отвечающий
  • Уважаемый пользователь,

    Пожалуйста, не забывайте отмечать ответы, являющиемся решением проблемы.

    Спасибо.


    Для связи [mail]
    28 декабря 2011 г. 6:23
  • Если кому интересно, сделал в итоге вот так:

    <Style x:Key="DragStyle">
    <Style.Resources>
    	<DataTemplate DataType="{x:Type Type1}">
    
    ...
    	</DataTemplate>
    	<DataTemplate DataType="{x:TypeType2}">
    ...
    	</DataTemplate>
    </Style.Resources>
    </Style> 
    
    <local:ItemsControlDragDropDecorator MyDragStyle="{StaticResource DragStyle}">

     

            public DragAdorner(object data, Style dragStyle, UIElement adornedElement, AdornerLayer adornerLayer)
                : base(adornedElement)
            {
                _adornerLayer = adornerLayer;
                _contentPresenter = new ContentPresenter() { Content = data, Style = dragStyle, Opacity = 0.75 };
    
                _adornerLayer.Add(this);
            }

     

    • Изменено skysniper777 28 декабря 2011 г. 11:12
    • Помечено в качестве ответа skysniper777 28 декабря 2011 г. 11:13
    28 декабря 2011 г. 11:10