Установка дочернего свойства Canvas без ItemsControl Свойство привязки ItemsSource - PullRequest
0 голосов
/ 17 января 2012

Существуют ли какие-либо средства для установки дочернего свойства Canvas без свойства привязки ItemsControl ItemsSource?

Чтобы отделить вид от модели представления, я должен связать элементы. Я использовал холст как дизайнер из 'CodeProject'

http://www.codeproject.com/KB/WPF/WPFDiagramDesigner_Part2.aspx

Я использую холст для перетаскивания. Это хорошо работает, когда я работаю вручную внутри холста. Это означает, что я добавляю и удаляю дочерние элементы, используя

myCanvas.Children.Add(userControl);
myCanvas.Children.Remove(userControl);

Но если я загружаю свои пользовательские элементы управления во время выполнения, они загружаются как представления.

<s:Canvas  AllowDrop="True" >

   <ItemsControl Grid.Row="1" ItemsSource="{Binding Path=userControls}">

        <ItemsControl.ItemsPanel>                        
            <ItemsPanelTemplate>
              <s:Canvas Background="Transparent"/>                                
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>

        <ItemsControl.ItemTemplate>
            <DataTemplate>                                
                <s:ControlItem Content="{Binding Path=MyView}"></s:ControlItem >
            </DataTemplate>
        </ItemsControl.ItemTemplate>

        <ItemsControl.ItemContainerStyle>
            <Style>
                <Setter Property="Canvas.Left" Value="{Binding Path=X}" />
                <Setter Property="Canvas.Top" Value="{Binding Path=Y}" />
            </Style>
        </ItemsControl.ItemContainerStyle> 

    </ItemsControl>

  </s:Canvas>

Ответы [ 2 ]

1 голос
/ 17 января 2012

Нет, нет. (За исключением ручной очистки и добавления ...)

0 голосов
/ 17 января 2012

Хм, да, просто рисовать предметы внутри холста? :)

<Canvas>
   <TextBlock Text="I'm Child #1" />
   <TextBlock Text="I'm Child #2" Canvas.Top="50" />
</Canvas>

Или вы всегда можете сделать это за кодом

myCanvas.Children.Add(myTextBlock);

foreach(var someControl in SomeControlList)
    myCanvas.Children.Add(someControl);

Редактировать

Я вижу ваше обновление и понятия не имею, о чем вы спрашиваете. Если вы хотите перетаскивать элементы на холст, лучше добавить / удалить элементы из ItemsSource, чем вручную добавлять / удалять элементы из холста. Простое добавление / удаление их из myCanvas не приведет к обновлению коллекции в вашем ItemsSource

Я бы порекомендовал взглянуть на статью Беа Столльниц о перетаскивании объектов с привязкой к данным . Это означает, что вы сохранили бы ItemsControl, который у вас есть сейчас, но когда вы опускаете элемент поверх Canvas, он добавляет DataItem за этим объектом к ObservableCollection<MyDataItem>, который вы называете userControls (мне не нравится это имя, потому что оно предполагает, что элементы данных содержат элементы пользовательского интерфейса, что не должно иметь место)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...