2016-01-29 2 views
0

Я хочу связать свойство одного объекта с аналогичным свойством одного из его дочерних объектов, тогда как этот дочерний контент (включая значение рассматриваемого свойства) получается из DataTemplate. Это все происходит в UserControl, если это имеет значение.WPF привязка к свойству, полученному с DataTemplate

<UserControl.Resources> 
    <DataTemplate x:Key="RText"> 
    <TextBlock Text="TextR" ToolTip="TextR"/> 
    </DataTemplate> 
</UserControl.Resources> 

<StackPanel x:Name="LayoutRoot" ToolTip="{Binding Path=ToolTip, ElementName=TemplText, FallbackValue='error'}"> 
    <TextBlock Text="Some common static text " /> 
    <ContentControl x:Name="TemplText" ContentTemplate="{StaticResource RText}" /> 
</StackPanel> 

Кроме того, в коде-позади, в конструкторе этого элемента управления, есть присвоение

LayoutRoot.DataContext = this

, который, по-видимому требуется для того, чтобы связываться с UserControl «s собственных свойств (это не показано в фрагменте). Думаю, это не имеет значения для этой проблемы, но мне нужна эта линия.

Идея заключается в следующем: вся StackPanel (LayoutRoot) должны иметь один и тот же ToolTip как ContentControl (TemplText). Однако эта всплывающая подсказка должна быть взята из указанного шаблона, т. Е. В этом случае будет «TextR».

Основная причина такого подхода состоит в том, что ContentControl в конечном итоге будет выбран с помощью довольно сложная DataTemplateSelector (назначаются ContentTemplateSelector, а не ContentTemplate), и я хочу, чтобы не создавать подобный селектор для общей подсказки. Я бы предпочел включить всплывающую подсказку в выбранный шаблон и затем распространить его, чтобы охватить весь элемент управления. Все элементы, в том числе и ToolTip, также будут гораздо более подробными, чем просто TextBlock, и нецелесообразно делать все это (StackPanel) выбираемым шаблоном.

Указанный выше код не работает в том смысле, что всплывающая подсказка не показана для всего элемента управления; он отображается только для TemplText. Тем не менее, FallbackValue также не отображается, что указывает на отсутствие проблем с этим путем: он находит элемент, но предположительно принимает ToolTip непосредственно из него (который равен null), а не из шаблона.

Есть ли проблема в этой проблеме? или, может быть, только лучший подход WPF для достижения того же результата? Я новичок в WPF.

Я понимаю, что у самой DataTemplate нет всплывающей подсказки; это один из его элементов. Но как я могу обратиться к нему? Или я должен каким-то образом использовать стиль, который принадлежит шаблону?

ответ

0

1. Установите ваш Binding в коде Window.Activated события.

private void Window_Activated(object sender, EventArgs e) 
{ 
    Binding b = new Binding("ToolTip"); 
    b.Source = VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(TemplText, 0), 0); 
    LayoutRoot.SetBinding(StackPanel.ToolTipProperty, b); 
} 

2.Set ToolTip от собственности в ViewModel.

<DataTemplate x:Key="RText"> 
    <TextBlock x:Name="Tb" Text="TextR" ToolTip="{Binding ToolTipProp}"/> 
</DataTemplate> 

<StackPanel x:Name="LayoutRoot" ToolTip="{Binding DataContext.ToolTipProp, ElementName=TemplText}"> 
+0

Что такое 'ToolTipProp'? – Zeus

+0

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

+0

Но это предполагает, что я программирую программную подсказку? .. Но я не хочу этого делать. Вся идея состоит в том, что код должен выбирать только «DataTemplate», и шаблон статически определяет соответствующую подсказку. Для данного шаблона есть только одна подходящая подсказка. – Zeus

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