2013-12-06 2 views
2

My UserControl требует привязки к предку (предка, являющегося MainWindow) и к себе (это код позади).Как установить DataContext для себя

Для привязки к предку, я использую

DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorLevel=1,AncestorType=Window}}"> 

Чтобы связать элемент управления кодом позади (и, таким образом, используя «местный» DataContext), я использую

<TextBlock Text ="{Binding MyUC3Property}" Name="MyName" /> 

и в коде позади, устанавливая его как

this.MyName.DataContext = this; 

Вышеприведенные отлично работает, где я могу связать с и т коде o предок.

Теперь я все еще хочу привязываться к коду позади и предку, но установить DataContext только в XAML (если возможно).

Я попытался

<TextBlock Text ="{Binding MyUC3Property}" DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}" /> 

и обеспечил конструктор не устанавливает DataContext (так как я хочу, чтобы все это было сделано в XAML) - (хотя даже если я установить this.DataContext = this; ошибка сохраняется)

и окно вывода говорит мне, что есть ошибка привязки.

System.Windows.Data Error: 40 : BindingExpression path error: 'MyUC3Property' property not found on 'object' ''TextBlock' (Name='')'. BindingExpression:Path=MyUC3Property; DataItem='TextBlock' (Name=''); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')

Я думаю, что мне не хватает чего-то очевидного, но я не могу сказать, что.

+0

* Какая * ошибка крепления есть? Что такое сообщение об ошибке? –

+0

В конструкторе окна/набора управления 'this.DataContext = this;' – RononDex

+0

Я предполагаю, что вы переименовали 'MyUC3Property' в' MyLocalProperty' для образца исходного кода в вопросе? –

ответ

2

Вы должны быть в состоянии связать пользовательский элемент управления точно так же, как и вы к окну:

DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorLevel=1,AncestorType=UserControl}}"> 

То, что вы пытались имел в виду относительный источник Self от TextBox. Однако в этом контексте Self относится к TextBox, а не к закрывающему пользовательскому элементу управления.

+0

У меня болит голова. Вы правы, это отвечает на вопрос, но как? Разумеется, код позади - это «сам», но похоже, что мы ищем эксеста, который находится на 1 уровне от этого элемента управления? – Dave

+0

@DaveRook: Я добавил объяснение, что пошло не так. –

+0

Прошу прощения, я могу дать только 1 * +1, какое чудесное объяснение. Спасибо – Dave

0

Прежде всего, вы должны, вероятно, нажать своего родителя DataContext на нижние уровни. Это даст вам «Бог» ViewMode, общий для всех вложенных экранов.

Во-вторых, вы должны использовать что-то вроде MVVMLightsMessanger, чтобы иметь более чистое разделение.

1

для пользовательского контроля вы никогда не должны устанавливать datacontext для себя. проверить комментарий от H.B. от here

я использую ElementName Связывание

<UserControl x:Name="uc"> 
    <TextBlock Text="{Binding ElementName=uc, Path=MyDependencyPropertyDefinedInMyUserControl}"/> 

с использованием UserControl:

<Window> 
    <MyUserControl MyDependencyPropertyDefinedInMyUserControl="{Binding Path=MyValueForTheTextBox}"/> 

я попытаюсь объяснить это немного для вашего текстового поля случая (игнор мой бедный английский кстати :))

Если вы хотите создать usercontrol с текстовым полем, и этот usercontrol/textbox должен показывать текст из разных режимов просмотра в разных представлениях - n у вас есть проблема, поскольку модели представления имеют разные имена свойств.теперь в игру входит свойство зависимостей в вашем usercontrol. вы создаете DP, где все ваши модели могут привязываться, и вы привязываете свое текстовое поле в своем пользовательском контроле только к DP из вашего пользовательского контроля.

+0

Если все связывается так, не означает ли это, что у вас большой «бог», такой как ViewModel (с которым у меня нет проблем с учетом данных и т. Д., Я просто хочу получить лучшее понимание) – Dave

+0

привязка имени элемента для ваш usercontrol не имеет ничего общего с viewmodel. viewmodel привязывается к Dependencyproperty из usercontrol – blindmeis

+0

Я ценю это, но это все равно означает, что все свойства будут жить выше дерева. Ваш пост действительно помог структурировать мой проект в целом, поэтому большое спасибо. Я предполагаю, что все мои UserControls должны быть довольно пустыми, кроме DependancyProperties? Как насчет функций/методов/Команды, должны ли они также жить там, где определены свойства? – Dave

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