Ошибка привязки стиля в DrawingImage

<Window x:Class="Project.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="100" Height="400">

    <Window.Resources>
        <Style x:Key="IconStyle" TargetType="{x:Type Image}">
            <Setter Property="Source">
                <Setter.Value>
                    <DrawingImage>
                        <DrawingImage.Drawing>
                            <GeometryDrawing Brush="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentControl}}, Path=Foreground}">
                                <GeometryDrawing.Geometry>
                                    <PathGeometry Figures="M 0,0 0,10 10,5" />
                                </GeometryDrawing.Geometry>
                            </GeometryDrawing>
                        </DrawingImage.Drawing>
                    </DrawingImage>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>

    <StackPanel>

        <ContentControl Foreground="Red">
            <Image Style="{StaticResource IconStyle}" />
        </ContentControl>

        <ContentControl Foreground="Blue">
            <Image Style="{StaticResource IconStyle}" />
        </ContentControl>

    </StackPanel>

</Window>

В этом примере показаны две иконки. Значки имеют цвет родительского ContentControl. Это работает нормально.

Но вывод показывает ошибку привязки:

Ошибка System.Windows.Data: 4: не удается найти источник для привязки со ссылкой 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ContentControl', AncestorLevel='1''. BindingExpression:Path=Foreground; Элемент данных = ноль; целевой элемент — «GeometryDrawing» (HashCode=8154127); целевое свойство — "Кисть" (тип "Кисть")

Почему возникает эта ошибка? Как исправить или можно не обращать внимания?

ИЗМЕНИТЬ

Ошибка возникает и в этом случае:

<Window x:Class="Project.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="100" Height="400">

    <Window.Resources>
        <Style x:Key="IconStyle" TargetType="{x:Type ContentControl}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ContentControl">
                        <Image>
                            <Image.Source>
                                <DrawingImage>
                                    <DrawingImage.Drawing>
                                        <GeometryDrawing Brush="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentControl}}, Path=Foreground}">
                                            <GeometryDrawing.Geometry>
                                                <PathGeometry Figures="M 0,0 0,10 10,5" />
                                            </GeometryDrawing.Geometry>
                                        </GeometryDrawing>
                                    </DrawingImage.Drawing>
                                </DrawingImage>
                            </Image.Source>
                        </Image>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>

    <StackPanel>    
        <ContentControl Foreground="Red" Style="{StaticResource IconStyle}" />    
        <ContentControl Foreground="Blue" Style="{StaticResource IconStyle}" />    
    </StackPanel>

</Window>

person Jotrius    schedule 18.03.2015    source источник
comment
У вас есть несколько ContentControls, это может вызвать проблему с вашей привязкой RelativeSource (даже если она сработает). Пробовали ли вы вместо этого использовать привязку ElementName?   -  person Mike Eason    schedule 18.03.2015
comment
Ошибка также возникает, если я использую привязку ElementName или удаляю один из двух элементов управления ContentControl.   -  person Jotrius    schedule 18.03.2015
comment
Это довольно странно, я имею в виду, что это работает, но все равно выдает ошибку. Было бы заманчиво проигнорировать его, однако должна быть какая-то причина, по которой он выдает ошибку. Правда в том, что я не знаю.   -  person Mike Eason    schedule 18.03.2015
comment
Из любопытства, что, если вы передадите строку цвета через свойство Tag вместо Foreground? Похоже на цветовое столкновение.   -  person Chris W.    schedule 18.03.2015
comment
Ошибка также возникает, если я использую свойство Tag элемента управления ContentControl.   -  person Jotrius    schedule 18.03.2015
comment
О, подождите, я не заметил этого с первого взгляда, почти уверен, что вы используете ContentControl amigo и TargetType, если бы это был я, я бы сделал это так старый ответ, и тогда вы должны потерять эту ошибку. Примером является SL, но концепция та же самая для wpf.   -  person Chris W.    schedule 18.03.2015
comment
Привет, спасибо за ваш ответ, но ошибка возникает и с вашим решением. (Я расширил вопрос с вашим решением.)   -  person Jotrius    schedule 19.03.2015


Ответы (1)


Просто задайте имя, и ошибка исчезнет:

  <GeometryDrawing x:Name="GeometryDrawing" Brush="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Foreground}">
                                        <GeometryDrawing.Geometry>
                                            <PathGeometry Figures="M 0,0 0,10 10,5" />
                                        </GeometryDrawing.Geometry>
                                    </GeometryDrawing>

Более причудливый способ привязки к Parent:

   RelativeSource={RelativeSource TemplatedParent}

ИЗМЕНИТЬ:

Если вы хотите подавить эти ошибки VS, посетите ссылка

person Dragos Stoica    schedule 19.03.2015
comment
спасибо за ваш ответ, но ошибка привязки не исчезает, если я устанавливаю x:Name для GeometryDrawing или использую RelativeSource={RelativeSource TemplatedParent} - person Jotrius; 19.03.2015
comment
Если вы используете оба, RelativeSource TemplatedParent и x:Name будут работать, по крайней мере, я не получаю эту ошибку в выводе. Просто попробуйте скопировать и вставить мой ответ в свое решение. - person Dragos Stoica; 19.03.2015
comment
Хорошо, это работает, но только для второго примера кода моего вопроса. Сначала я тестирую его только с первым примером кода. Кстати, в данном случае работает с обоими вариантами привязки: FindAncestor, TemplatedParent - person Jotrius; 19.03.2015
comment
Я буду исследовать также первый пример. - person Dragos Stoica; 19.03.2015
comment
Я не могу найти решение для первого примера, потому что Snoop не выдает никаких ошибок. Таким образом, ошибки привязки нет. Если вы хотите подавить эти сообщения об ошибках, посетите это: codeproject.com/Tips/124556/ - person Dragos Stoica; 19.03.2015