2015-03-18 2 views
4
<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. Он работает нормально.Ошибка привязки в стиле DrawingImage

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

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

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

EDIT

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

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

У вас есть несколько ContentControls, это может вызвать проблемы с RelativeSource связывания (даже если он работал), вы пробовали используя вместо этого привязку ElementName? –

+0

Ошибка возникает также, если я использую привязку ElementName или если я удалю один из двух ContentControls. – Pearson

+0

Это довольно странно, я имею в виду, что это действительно работает, но это все равно порождает ошибку. Было бы заманчиво проигнорировать это, однако должна быть какая-то причина, почему это порождает ошибку. Правда, я не знаю. –

ответ

2

Просто установить имя и ошибка исчезнет:

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

более причудливый способ для связывания с Родитель:

RelativeSource={RelativeSource TemplatedParent} 

EDIT:

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

+0

спасибо за ваш ответ, но ошибка привязки не исчезнет, ​​если я установил x: Name для GeometryDrawing или если я использую RelativeSource = {RelativeSource TemplatedParent} – Pearson

+0

Если вы используете оба, RelativeSource TemplatedParent и x: Name будут работать, по крайней мере, я не получаю эту ошибку в Output. Просто попробуйте скопировать мой ответ в ваше решение. –

+0

Хорошо, это работает, но только для ** второго примера кода ** моего вопроса. Сначала я тестирую его только с первого примера кода. Кстати, он работает с обоими вариантами привязки в этом случае: FindAncestor, TemplatedParent – Pearson

Смежные вопросы