设置不带ItemsControl的Canvas子属性ItemsSource绑定属性

时间:2012-01-17 16:06:20

标签: c# .net wpf xaml

有没有办法在没有ItemsControl ItemsSource绑定属性的情况下设置Canvas Children属性?

为了使我的视图与viewmodel保持分离,我必须绑定项目。 我使用画布作为'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 个答案:

答案 0 :(得分:1)

不,那不行。 (除非手动清除和添加......)

答案 1 :(得分:0)

嗯,是的,只是在画布里画画物品? :)

<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's article on dragging/dropping databound Items。这意味着您将保留现在的ItemsControl,但当您将项目放在Canvas之上时,它会将该对象后面的DataItem添加到您调用的ObservableCollection<MyDataItem> userControls (我不喜欢这个名字,因为它表明数据项包含UI项目,不应该是这种情况)