2013-03-10 2 views
1

Есть ли легкий взлом для выполнения следующих действий?Задание нескольких RelativeSource.AncestorTypes

<Binding RelativeSource="{RelativeSource AncestorType=UserControl OR Window}" Path="Tag" /> 

Я просто хочу привязать свойство тега родительского уровня верхнего уровня, которое может быть либо UserControl, либо Window. Обратите внимание, однако, что расстояние от текущего элемента управления до родителя произвольное, поэтому я не могу использовать AncestorLevel.

+0

Там нет причин, чтобы перечислить тег в ваших заголовках вопросов. См. Http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles для обсуждения того, почему это не нужно. – Patrick

+0

Кроме того, подобно тому, что написал stukselbax в ответ на ваш [другой вопрос] (http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles), вы, вероятно, могли бы решить эту проблему с расширением разметки или с некоторым преобразователем значений. Вы пробовали это? – Patrick

+0

@Patrick: Спасибо за советы по использованию тегов. Это имеет смысл. Что касается ответа stukselbax (возможно, вы захотите исправить ссылку в своем комментарии), это довольно сложно для меня на этом этапе. Как вы видите ниже в ответе Фила, решение было намного проще. – dotNET

ответ

3

Ну, если это хак вы хотите :)

public partial class MainWindow : ITopLevel 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     Tag = "I'm at the top"; 
    } 
} 

public interface ITopLevel 
{ 
    // optionally specify Tag in the interface, it will work either way 
    object Tag { get; set; } 
} 

<Grid> 
    <Button Content="{Binding Path=Tag, RelativeSource={RelativeSource 
      FindAncestor, AncestorType={x:Type Demo:ITopLevel}}}"/> 
</Grid> 
+0

Хммм это интересный подход! В настоящее время я подхожу к этой проблеме, имея MainWindowViewModel с материалом, который мне нужен. Я либо использую привязку окна FindAncestor в xaml, либо передаю MainWindowViewModel ребенку с помощью IoC и получаю доступ к тому, что мне нужно. – failedprogramming

+0

@Phil: Отлично. Интересно, почему в мире я не придумал эту простую идею. – dotNET

0

Вы можете просто использовать MultiBinding вместо Binding для этого, а затем сделать простой IMultiValueConverter, который находит первый элемент в «ценности», которые не нуль (или DependencyProperty.UnsetValue, который имеет тенденцию выскакивать при работе с визуальным деревом.

это менее Hacky способ сделать это, и отлично работает для меня.

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