Как получить привязку к другому классу, кроме ItemsSource, из ItemsControl? - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть класс ShapeGrid, который содержит основную информацию, такую ​​как размер, и содержит список Shape. При печати каждого объекта в Shapes, как получить свойство ShapeSize из ShapeGrid?

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 я могу получить класс контейнера, но не могу просмотреть список всех фигур, не выписывая их одну за другой.

<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>

Мне нужны ShapeSize от ShapeGrid и Color from Shape, оба в теге Rectangle. Есть ли способ сделать это?

Редактировать: я мог бы поместить свойство ShapeSize в каждый отдельный Shape, но представляю, было ли это какое-либо внешнее значение, например, windowSize и т. Д.

1 Ответ

0 голосов
/ 07 апреля 2019

Я не уверен, какова цель использования ContentControl без ContentPresenter в шаблоне (который позволяет вам размещать 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>

...