正在设置不带ItemsControl ItemsSource Binding属性的Canvas Children属性

本文关键字:属性 Binding Canvas Children ItemsSource ItemsControl 设置 | 更新日期: 2023-09-27 18:20:38

是否有任何方法可以在没有ItemsControl ItemsSource Binding属性的情况下设置Canvas Children属性?

为了保持视图与视图模型的分离,我必须绑定这些项。我曾使用画布作为"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>

正在设置不带ItemsControl ItemsSource Binding属性的Canvas Children属性

不,没有。(手动清除和添加除外…)

嗯,是的,只是在画布内绘制项目?:)

<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 中的集合

我建议大家看看Bea Stollnitz关于拖放数据绑定项的文章。这意味着您将保留现有的ItemsControl,但当您将一个项目放在Canvas的顶部时,它会将该对象后面的DataItem添加到您称之为userControlsObservableCollection<MyDataItem>中(我不喜欢这个名称,因为它表明数据项目包含UI项目,而事实并非如此)