如何从 ItemsControl 中获取与 ItemsSource 以外的 Class 的绑定?

How to get a Binding to other Class than ItemsSource from within ItemsControl?

我有一个 class ShapeGrid,其中包含基本信息(例如大小)和一个 Shape 列表。在打印出 Shapes 中的每个对象时,如何从 ShapeGrid 获取 ShapeSize 属性?

public class ShapeGrid
{
    public List<Shape> Shapes { get; set; }
    public int GridSize { get; private set; }
    public double ShapeSize { get; private set; }
}

public class Shape
{
    public Brush Color { get; set; }
    public int Id { get; set; }
}

在使用 ContentControl 时,我可以获得容器 class,但如果不将它们一一写出,我将无法查看所有形状的列表。

<ContentControl Content="{Binding ShapeGrid}" Grid.Row="2" Grid.Column="2">
     <ContentControl.ContentTemplate>
        <DataTemplate>
            <WrapPanel>
                <Rectangle Fill="{Binding Shapes[0].Color}" Height="{Binding ShapeSize}" Width="{Binding ShapeSize}" />
            </WrapPanel>
        </DataTemplate>
    </ContentControl.ContentTemplate>
</ContentControl>

在使用 ItemsSource 时,我将无法访问容器值。

<ItemsControl ItemsSource="{Binding ShapeGrid.Shapes}" Grid.Row="2" Grid.Column="2">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <WrapPanel>
                <Rectangle Fill="{Binding Color}" Height="20" Width="20" />
                //this is what I want to
                //<Rectangle Fill="{Binding Color}" Height="{Binding ShapeGrid.ShapeSize}" Width="{Binding ShapeGrid.ShapeSize}" />
            </WrapPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

我需要 ShapeGrid 的 ShapeSize 和 Shape 的颜色,它们都在 Rectangle 标签中。有办法吗?

编辑:我可以将 ShapeSize 属性 放在每个单独的 Shape 中,但想象一下它是否是任何类型的外部值,如 windowSize 等

我不确定在模板中使用没有 ContentPresenter 的 ContentControl 的目的是什么(它允许您将 Rectangle 作为内容而不是模板放置,并且还允许您直接使用绑定。

但是假设这是故意的: 问题是您丢失了模板内的上下文。 您可以使用绑定代理,它允许您绑定到模板中父对象的对象。 您可以在此处找到它的示例实现: https://thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/

然后你可以这样做(未测试):

<ContentControl x:name="MyContentControl" Content="{Binding ShapeGrid}" Grid.Row="2" Grid.Column="2">
 <ContentControl.Resources>
       <local:BindingProxy x:Key="shapeProxy" Data="{Binding ShapeGrid}" />
 </ContentControl.Resources>
 <ContentControl.ContentTemplate>
    <DataTemplate>
        <WrapPanel>
            <Rectangle Fill="{Binding Shapes[0].Color}" Height="{StaticResource  shapeProxy, Path=Data.ShapeSize}" Width="{StaticResource  shapeProxy, Path=Data.ShapeSize}" />
        </WrapPanel>
    </DataTemplate>
</ContentControl.ContentTemplate>