Динамическое добавление пользовательских элементов управления с именами выдает «исключение недопустимого диапазона» Silverlight - PullRequest
2 голосов
/ 06 апреля 2010

В моем приложении Silverlight у меня есть обработчик событий, который динамически создает новый экземпляр пользовательского элемента управления и добавляет его в свойство Content другого элемента управления. Это прекрасно работает без ошибок, пока я не назначу имя (x: Name = "") пользовательскому элементу управления (не в событии, а в XAML пользовательского элемента управления. Затем, когда я устанавливаю шаблон для свойства .Content из элемента управления я получаю исключение «System.ArgumentException не обрабатывается пользовательским кодом / значение не попадает в ожидаемый диапазон.» Исключение. Я понятия не имею, где ошибка или где искать ... она в значительной степени встроена в SL. Не могу понять, какое еще свойство мне нужно установить.

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

TilePane p = e.Element as TilePane; // this is the target
AppTileNormalViewControl template = new AppTileNormalViewControl(); // this is the user control
p.Content = template; // error happens here

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

Text="{Binding ElementName=UserControlName, Path=PublicProperty}"

Без ElementName привязка не работает. Поэтому, если я укажу имя, будет работать привязка имени, но я не могу добавить элемент управления. Идеи?

1 Ответ

2 голосов
/ 06 апреля 2010

Проблема в том, что свойство Name элемента UserControl станет частью набора доступных имен элементов в области, к которой принадлежит ваш элемент управления контентом. Как только вы попытаетесь добавить два из этих элементов таким образом, вы в конечном итоге попытаетесь добавить одно и то же имя, что приведет к ошибке, которую вы видите.

Имя UserControl на самом деле является делом пользователя usercontrol, а не самого пользовательского элемента управления, поэтому вы должны удалить это x:Name. Альтернатива, которая работает, выглядит следующим образом: -

Text="{Binding Parent.PublicProperty, ElementName=LayoutRoot}"

Usercontrol содержит единственный корневой элемент, в который вы помещаете весь его пользовательский интерфейс, и этот элемент (обычно это Grid, но на самом деле может быть любым FrameworkElement) обычно имеет имена LayoutRoot. FrameworkElement имеет свойство Parent, которое в случае корня макета UserControl будет само по себе UserControl.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...