如何从 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>
我有一个 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>