Полагаю, у вас до сих пор нет четкого представления о WPF.
Вы сталкиваетесь с таким количеством неприятностей, потому что ваш подход больше похож на winforms, чем на функционал.WPF усложняет вашу жизнь, если вы настаиваете на его обязательном использовании.
Прежде всего, шаблон представляет собой функцию, которая инструктирует движок WPF о том, как создать фактическое визуальное дерево во время выполнения.Вы должны использовать имя в качестве ссылки в шаблоне ONLY внутри элемента управления хостингом (т.е. MyUserControl2) и получать ссылку на экземпляр из метода OnApplyTemplate.Больше нигде.
Пример:
private MyUserControl1 _myUserControl1;
public override void OnApplyTemplate()
{
this._myUserControl1 = this.GetTemplateChild("myUserControl1") as MyUserControl1;
//here you should check whether the instance is actually set
}
Ссылка на любой элемент управления должна храниться как частная: никакая защищенная / внутренняя / открытая экспозиция какого-либо из размещенных элементов управления.
Второй пункт: как связать два свойства вместе.
Ваша цель - «связать» свойство элемента управления с другим, предоставляемым размещенным.Эта задача абсолютно нормальная, и это одна из лучших функций, предлагаемых WPF.
Предположим, что два свойства имеют один и тот же тип, поэтому могут быть связаны напрямую.В вашем xaml:
<ControlTemplate TargetType="{x:Type UserControl}">
...
<local:MyUserControl1 x:Name="myUserControl1"
SomeProperty="{Binding Path=DP1, RelativeSource={RelativeSource Mode=TemplatedParent}}"
.../>
...
</ControlTemplate>
Обратите внимание, что: (1) SomeProperty должно быть DependencyProperty, (2) должно быть доступно для записи, (3) DP1 должно быть также DP, или, по крайней мере, уведомлять о любых измененияхчерез шаблон INotifyPropertyChanged.
Изображенный синтаксис обычно связывается: SomeProperty = DP1, но не наоборот.Если вам нужно двунаправленное отображение, вы должны добавить «Mode = TwoWay» внутри предложения «Binding».
Если вы хотите настроить функцию, которая отображает два свойства, просто определите свой собственный конвертер через интерфейс IValueConverter, затем объявите это в xaml.
Здесь вы найдете несколько полезных сведений: http://msdn.microsoft.com/en-us/library/ms752347.aspx
Cheers