Словари ресурсов кажутся немного странным способом сделать это. Словари ресурсов - это все для совместного использования экземпляров - они позволяют вам использовать один экземпляр чего-либо (например, стиль, шаблон, кисть или что-то еще) из разных мест. На самом деле они не являются механизмом разделения вашего пользовательского интерфейса для упрощения отдельных файлов Xaml.
Обычный механизм разделения чрезмерно сложных файлов Xaml на несколько более управляемых небольших файлов - это пользовательский элемент управления. (Словарь ресурсов слияние вступает в игру, когда у вас уже есть словарь ресурсов, и он становится слишком большим. Но обычно вы не вводите словарь ресурсов просто для того, чтобы начать разбивать вещи. Наоборот, словари ресурсов склонны поощрять чрезмерно большие файлы Xaml, поэтому слияние словаря должно было быть изобретено в первую очередь!)
В большинстве случаев, когда я определяю шаблон данных, я заставляю его содержать только один пользовательский элемент управления. И если это станет более сложным, я разделю этот пользовательский элемент управления на несколько пользовательских элементов управления.
Судя по вашему описанию, ваш Xaml-файл стал большим, потому что у вас есть четыре больших иерархических шаблона данных. Если бы вы взяли тело каждого шаблона и превратили его в пользовательский элемент управления, ваши четыре шаблона теперь стали бы очень простыми - что-то вроде этого:
<HierarchicalDataTemplate x:Key="t1" ItemsSource="{Binding Path=Children}">
<loc:TreeItemTypeOne />
</HierarchicalDataTemplate>
и вам, скорее всего, больше не нужно помещать эти шаблоны в отдельные файлы. Но поскольку внутренности каждого шаблона теперь находятся в пользовательском элементе управления, это дает вам возможность оставить свой код позади.
Вы упомянули о необходимости ссылки на родительский элемент управления. Это беспокоит меня - это звучит так, как будто у вас слишком много кода в вашем коде. Но одна вещь за раз ... Вы можете решить эту проблему, определив свойство зависимости ParentControl в вашем пользовательском элементе управления, а затем поместите это в шаблон:
<loc:TreeItemTypeOne
ParentControl="{Binding RelativeSource=
{RelativeSource AncestorType=loc:ParentControlType}}" />
Но, честно говоря, как только я нахожусь в положении, где мне это нужно, я спрашиваю себя: как я оказался в положении, когда это казалось необходимым, и что я могу сделать, чтобы это исправить?