将集合绑定到画布

时间:2015-11-13 20:45:26

标签: c# wpf xaml canvas collections

我有以下类:Marker - 带X,Y坐标的简单类;图层 - 标记的集合(将来它可能包含其他数据或标记的外观),图层 - 图层集合。

在XAML中,标记由Ellipse表示。

我尝试在另一个ItemsControl中使用ItemsControl。我在定位标记时遇到了问题。我无法从内部元素设置Canvas.Top和Canvas.Left。在第一个ItemsControl中它很好,但在它的孩子中是不可能的。

我尝试了多个Canvas重叠。它看起来很好,但鼠标事件有问题。只有顶级画布可以处理它们。

如何正确绑定集合集合?我是否必须进行具有所有元素的临时收集。也许有人有更好的主意?

public class MarkerClass: INotifyPropertyChanged
{
    public int X
    { get; set; }

    public int Y
    { get; set; }

    public MarkerClass(int x, int y)
    {
         X = x;
         Y = y;
    }
    /*...*/
}

public class LayerClass: INotifyPropertyChanged
{
    public ObservableCollection<MarkerClass> Markers
    { get; set; }

    public LayerClass()
    {
        Markers = new ObservableCollection<MarkerClass>();
    }
    /*...*/
}

public class ViewModel: INotifyPropertyChanged
{
    public ObservableCollection<LayerClass> Layers;

    public ViewModel()
    {
         Layers = new ObservableCollection<LayerClass>();
    }
    /*...*/
}

XAML(尝试使用2个ItemsControls)。我尝试的第二种方法是将Canvas对象放在第一个ItemControl的DataTemplate中。

 <Grid>
       <ItemsControl ItemsSource="{Binding Path=Layers}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Canvas/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>                             
            <ItemsControl.ItemTemplate>
                <DataTemplate><!-- Second ItemsControl -->
                    <ItemsControl ItemsSource="{Binding Path=Markers}">
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                  <Ellipse Fill="Black" Width="20" Height="20"></Ellipse>
                            </DataTemplate>                            
                        </ItemsControl.ItemTemplate>
                        <ItemsControl.ItemContainerStyle>
                        <!--This doesn't work in inner ItemsControl -->
                            <Style>
                                  <Setter Property="Canvas.Left" Value="{Binding Path=X}"/>
                                <Setter Property="Canvas.Top" Value="{Binding Path=Y}"/>
                            </Style>
                        </ItemsControl.ItemContainerStyle>
                    </ItemsControl>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
      </ItemsControl>
 </Grid>

0 个答案:

没有答案