Приложение WPF, которое я унаследовал, содержит значительное количество XAML, которое следует такой схеме:
<Window ...>
<Grid>
<z:SomeUserControl>
<z:AnotherUc>
<Label /> <Button /> <ComboBox />
</z:AnotherUc>
<z:AnotherUc>
<Label /> <Button /> <ComboBox />
</z:AnotherUc>
</z:SomeUserControl>
</Grid>
</Window>
Другими словами, у нас есть разделы пользовательского интерфейса, сгруппированные по UserControl, часто вложенные в другие UserControls. В какой-то момент контент определяется с помощью основных элементов управления контентом WPF.
Проблема, с которой мы пытаемся справиться, заключается в том, что атрибут x: Name нельзя применить ни к одному из самых внутренних элементов управления из-за печально известного ограничения WPF:
Невозможно установить значение атрибута имени {0} для элемента {1}. {1} входит в область действия элемента {2}, имя которого уже зарегистрировано, когда оно было определено в другой области действия
Это создает проблему, потому что выделенный код должен иметь возможность ссылаться на элементы в пользовательских элементах управления. UserControls были выбраны для группировки частей пользовательского интерфейса, потому что все стили и шаблоны элементов управления по умолчанию, потому что слишком непривлекательно и разметка быстро превратились в ужасный, нечитаемый беспорядок.
Однако, если Microsoft не намерена разрешать это так называемое «ограничение», необходимо найти лучший способ. Учитывая, что использование CS + внешнего файла шаблона XAML было размещено, как показано в работе GaryGJohnson
на сайте подключения. Однако это вызывает чувство сфагетти, и все, что нарушает связывание, не допускается.