2016-12-20 5 views
0

Я пытаюсь показать всплывающее окно на DataTemplate элемент TextEdit (от DevExpress), в соответствии с this и this темы я создал что-то вроде этого:Найти предка в DataTemplate

<DataTemplate x:Key="SomeTemplate"> 
    <dxe:TextEdit x:Name="SomeTextEdit" Text="{Binding DisplayText, Mode=OneWay}" 
        EditMode="InplaceInactive"> 
     <dxe:TextEdit.ContextMenu> 
      <ContextMenu/> 
     </dxe:TextEdit.ContextMenu> 
     <Popup PlacementTarget="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type dxe:TextEdit}}}" IsOpen="{Binding IsKeyboardFocused, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type dxe:TextEdit}}, Mode=OneWay}"> 
      <TextBlock Background="White"> 
       <TextBlock.Text>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</TextBlock.Text> 
      </TextBlock> 
     </Popup> 
    </dxe:TextEdit> 
</DataTemplate> 

И это не работает, в Окно «Диагностические инструменты». Я получаю сообщение:

Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='DevExpress.Xpf.Editors.TextEdit', AncestorLevel='1''. BindingExpression:(no path); DataItem=null; target element is 'Popup' (Name=''); target property is 'PlacementTarget' (type 'UIElement') 

Почему это?

+0

Похоже, что вы можете захотеть «RelativeSource Self» здесь - вы пробовали это? –

ответ

2

Popup будет использовать различные VisualTree и мы не можем использовать RelativeSource метод связывания, чтобы найти элемент из основного VisualTree .Still вы можете установить PlacementTarget через ElementName связывания. Вы можете использовать вот так:

<Popup IsOpen="{Binding PlacementTarget.IsKeyboardFocused, RelativeSource={RelativeSource Mode=Self},Mode=OneWay}" PlacementTarget="{Binding ElementName=SomeTextEdit}"> 
    <TextBlock Background="White" Text="Hi" /> 
</Popup>