我遇到了将ItemsControl绑定到已包含形状的集合的问题。我不需要DataTemplate,但我想指定集合中包含的项目的Top / Left位置。
<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')
看起来Geometry属性正在应用于Model,而不是Element。
我添加了一个转换器用于调试目的:
<Setter Property="Canvas.Left" Value="{Binding ., Converter={StaticResource debugConverter}}" />
当我在DebugConverter中设置断点时,传入的&#34;对象&#34;是Model而不是Element。这似乎是错的,我希望它是元素。如何获得元素?
答案 0 :(得分:-1)
在ItemContainerStyle上DataContext被“重置”似乎存在一个已知问题,因为它在绑定发生之前被评估。在构造模型时,我最终只是显式调用了Canvas.SetLeft()和Canvas.SetTop()。不是一个理想的解决方案,但它确实有效。