在项中使用形状项控件中指定左侧、顶部坐标

本文关键字:坐标 顶部 控件 | 更新日期: 2023-09-27 17:55:11

我在将 ItemsControl 绑定到已包含形状的集合时遇到问题。我不需要数据模板,但我想指定集合中包含的项的顶部/左侧位置。

<ItemsControl x:Name="regions" DataContext="{Binding Path=Model}" ItemsSource="{Binding Path=Items}">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <Canvas x:Name="canvas" Background="Yellow" />
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                </ItemsControl>
public Model Model {get;}
public class Model : INotifyPropertyChanged
{
    public ObservableCollection<Element> Items {get;}
}
public class Element : Shape
{
    public override System.Windows.Media.Geometry Geometry {get;}
}

我尝试使用 ItemsControl.ItemContainerStyle,但出现此绑定错误:

                      <ItemsControl.ItemContainerStyle>
                        <Style>
                            <Setter Property="Canvas.Left" Value="{Binding Geometry.Bounds.Left}" />
                            <Setter Property="Canvas.Top" Value="{Binding Geometry.Bounds.Top}" />
                        </Style>
                    </ItemsControl.ItemContainerStyle>
System.Windows.Data Error: 40 : BindingExpression path error: 'Geometry' property not found on 'object' ''Model' (HashCode=41545796)'. BindingExpression:Path=Geometry.Bounds.Top; DataItem='Model' (HashCode=41545796); target element is 'Element' (Name=''); target property is 'Top' (type 'Double')

看起来几何属性正在应用于模型,而不是元素。

我添加了一个用于调试目的的转换器:

<Setter Property="Canvas.Left" Value="{Binding ., Converter={StaticResource debugConverter}}" />

当我在调试转换器中设置断点时,传入的"对象"是模型类型而不是元素。这似乎是错误的,我希望它是元素。如何获取元素?

在项中使用形状项控件中指定左侧、顶部坐标

ItemContainerStyle 上"重置"数据上下文似乎存在一个已知问题,因为它是在绑定发生之前评估的。当我构建模型时,我最终只是显式调用了 Canvas.SetLeft() 和 Canvas.SetTop()。不是一个理想的解决方案,但它奏效了。