2016-08-30 6 views
0

Привет stackoverflowers.Добавить динамически пользовательские элементы управления

Я хотел бы динамически отображать некоторые элементы на экране. У меня есть базовый класс OverlayElement и некоторые дочерние классы. Базовый класс OverlayElement содержит элемент FrameworkElement, который соответствует небольшому usercontrol, который определяет способ рисования моего элемента OverlayElement.

У меня есть OverlayViewModel, который содержит коллекцию OverlayElements, привязанную к Itemcontrol в представлении.

Вот выдержки из OverlayElement и ребенка.

public abstract class OverlayElement : INotifyPropertyChanged 
{ 
    public UserControl View; 
} 


public class ImageOverlayElement : OverlayElement 
{ 
    public ImageOverlayElement(Point start, Point end) 
    { 
     View = new ImageOverlayElementView(); 
    } 
} 

Вот Exemple из ImageOverlayElementView

<UserControl x:Class="Client.ImageOverlayElementView" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:Client" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300" 
      d:DataContext="{d:DesignInstance local:ImageOverlayElement}"> 
    <Grid> 
      <Image 
       Source="{Binding ImageSource}" 
       Height="{Binding Height}" 
       Width="{Binding Width}"/> 
    </Grid> 
</UserControl> 

И это, как я стараюсь использовать эти элементы. Моя проблема заключается в том, что я не знаю, как вставить свой UserControl Вид из OverlayElement (инициализирован в дочернем классе):

<ItemsControl 
     ItemsSource="{Binding OverlayElementsList}" 
     Background="Transparent"> 

<ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
     <Canvas/> 
     </ItemsPanelTemplate> 
</ItemsControl.ItemsPanel> 

<ItemsControl.Resources> 

    <DataTemplate DataType="{x:Type elements:OverlayElement}"> 
     <!-- Need help for here, how can I insert my UserControl View from OverlayElement ? (initialized in the child class) --> 
    </DataTemplate> 

</ItemsControl.Resources> 
</ItemsControl> 
+0

'public abstract class OverlayElement: INotifyPropertyChanged {public UserControl View; } 'nope. – Will

ответ

1

Вы можете просто поставить вид в ContentControl:

<DataTemplate DataType="{x:Type local:OverlayElement}"> 
    <ContentControl Content="{Binding View}" /> 
</DataTemplate> 

Но сделать конечно View - свойство, иначе оно не будет работать с привязкой данных.

+0

Он отлично работает, спасибо :) – Csi

+0

@ Csi, Рад, что это помогло, ура! знак равно – icebat

Смежные вопросы