Как мой установщик стилей может получить DataContext элемента, стиль которого устанавливается? - PullRequest
0 голосов
/ 27 апреля 2020

Кажется, что это должно быть просто как p ie, но я не могу понять это.

Я пытаюсь изменить рабочий Style Setter для свойства "Fill" на элементе, чтобы фактически объявите объект SolidColorBrush в XAML в Setter.Value. К сожалению, в моем объявлении bru sh я не могу «добраться до» DataContext того самого объекта, чье заполнение я пытаюсь установить. Как я могу это сделать?

Ниже приведен стиль с сеттером. Он использует конвертер, который принимает значение перечисления («Использование») и возвращает значение цвета. Преобразователь в порядке, но привязка не выполняется, поскольку он не может найти объект.

<core:UsageToColorConverter x:Key="CvtUsageToColor"/>

<Style x:Key="RegionBandStyle" 
       TargetType="{x:Type tk:CartesianPlotBandAnnotation}">

    <!--  Help Intellisense show us the correct bindings when coding  -->

    <d:Style.DataContext>
        <x:Type Type="gci:IProfileRegion" />
    </d:Style.DataContext>


    <Setter Property="Fill">
        <Setter.Value>
            <SolidColorBrush >
                <SolidColorBrush.Color>
                    <!-- THIS BINDING FAILS:  It cannot find the "ancestor" CartesianPlotBandAnnotation
                         in order to get at its DataContext
                    -->
                    <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type tk:CartesianPlotBandAnnotation}}" 
                        Path="DataContext.(gci:IProfileRegion.Usage)"
                        Converter="{StaticResource CvtUsageToColor}"/>
                </SolidColorBrush.Color>
            </SolidColorBrush>
        </Setter.Value>
    </Setter>

</Style>

Привязка завершается с этим сообщением:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='Telerik.Windows.Controls.ChartView.CartesianPlotBandAnnotation', AncestorLevel='1''. BindingExpression:Path=DataContext.Usage; DataItem=null; target element is 'SolidColorBrush' (HashCode=39731869); target property is 'Color' (type 'Color')

Полагаю, это имеет смысл. Мое смутное понимание, что Bru sh не в визуальном (или логическом) дереве, верно? Значит, он не может найти предка? Это причина?

Оригинальная версия этого Сеттера работала, но это было намного проще. Он просто использовал аналогичный конвертер, который возвращает SolidColorBrush вместо цвета:

    <Setter Property="Fill"  Value="{Binding Usage, Converter={StaticResource CvtUsageToBrush}}"/>

Это работало нормально, но, к сожалению (по несвязанным причинам), мне нужно сделать что-то другое; Мне нужно самому объявить Bru sh, используя синтаксис элемента свойства

Может кто-нибудь сказать мне, какое связывание мне нужно здесь, чтобы получить DataContext CartesianPlotBandAnnotation в моей SolidColorBrush привязке цвета?

(Это проблема связывания, которая заставляет мою голову кружиться независимо от того, сколько раз я читаю на логическом и визуальном деревьях. В моих поисках постоянно появляются связанные темы, но не та, которую я хочу.)

1 Ответ

0 голосов
/ 28 апреля 2020

Режим FindAncesstor объекта RelativeSource может использоваться для поиска родительского элемента в дереве визуалов. Однако, это не так. Цвет bru sh должен наследовать контекст данных элемента. Попробуйте вообще удалить установщик RelativeSource. Кроме того, вы уверены, что использование является прикрепленным свойством? Если нет, просто установите «Использование» в пути. Если это не поможет, по крайней мере, вы получите новое сообщение об ошибке, в котором говорится, какой объект фактически указан в DataContext CartesianPlotBandAnnotation.

Обновление: в случае привязки интерфейса должно быть достаточно установить для Path значение "(gci: IProfileRegion.Usage)". Я только что проверил этот код и подтвердил, что он работает правильно: https://github.com/Drreamer/ColorInterfaceBinding Если он не работает в вашем проекте, уточните, какое исключение возникает в этом случае. Это помогает найти точную причину проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...