2014-09-17 2 views
1

Я хотел бы отобразить кучу пользовательских элементов на холсте, но каждый пользовательский контроль должен отображаться как содержимое настраиваемого элемента управления контентом.Проблемы с рендерингом настраиваемого элемента управления WPF в Canvas с помощью элемента ItemsControl

Пользовательский элемент управления содержимым называется Window и предоставляет границу, некоторые кнопки и т. Д. И позволяет пользователю перетаскивать окно вокруг холста. Я определил холст и своих детей, как это:

<ItemsControl Grid.Column="2" Grid.Row="1" ItemsSource="{Binding Views}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <Canvas /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <controls:Window Title="Test" Width="300" Height="300" Content="{Binding}" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
    <ItemsControl.ItemContainerStyle> 
     <Style> 
      <Setter Property="Canvas.Top" Value="50"/> 
      <Setter Property="Canvas.Left" Value="50"/> 
     </Style> 
    </ItemsControl.ItemContainerStyle> 
</ItemsControl> 

Но когда каждый элемент оказывается, это показано без окружающего управления содержимым окна. На самом деле он даже не попадает в конструктор Window. Это говорит мне, что он игнорирует DataTemplate и просто добавляет usercontrol к холсту напрямую, но я не уверен, почему.

Любые предложения?

ответ

1

ОБНОВЛЕНО

Найдено решение этой проблемы на другой стек нити Using binding to a List <UserControl> how can I do for not showing the controls

В принципе, как вы уже нашли, когда вы связываете к списку <UserControl> s вы получите ошибки 26 и <DataTemplate> игнорируется. Простая работа заключается в том, чтобы обернуть <UserControl> в другой класс, чтобы он не обнаруживался как элемент управления. Затем вы можете привязать <UserControl> к <DataTemplate>, используя свойство на обертке.

Так разработать я создал класс-оболочку, как показано ниже:

public class ViewWrapper 
{ 
    public UserControl View { get; set; } 
} 

Затем я изменил список на моем контроле использовать ViewWrapper:

public ObservableCollection<ViewWrapper> ViewWrappers { get; set; } 

Теперь я могу связать свой список к <ItemsControl> без его игнорирования моего <DataTemplate>. Я использую свойство View для оболочки для доступа к представлению.

 <ItemsControl ItemsSource="{Binding ViewWrappers}"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <Grid> 
         <ContentControl Content="{Binding View}"/> 
         <Label Content="End of this item." /> 
        </Grid> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
+0

Thanks Jynx! Я отдам это. –