在项中使用形状项控件中指定左侧、顶部坐标
本文关键字:坐标 顶部 控件 | 更新日期: 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()。不是一个理想的解决方案,但它奏效了。