我有以下类: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>