使用形状项指定ItemsControl中的左,顶部坐标

时间:2016-07-06 12:31:03

标签: c# wpf

我遇到了将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。这似乎是错的,我希望它是元素。如何获得元素?

1 个答案:

答案 0 :(得分:-1)

在ItemContainerStyle上DataContext被“重置”似乎存在一个已知问题,因为它在绑定发生之前被评估。在构造模型时,我最终只是显式调用了Canvas.SetLeft()和Canvas.SetTop()。不是一个理想的解决方案,但它确实有效。