как связать контейнер и его содержимое? - PullRequest
1 голос
/ 04 ноября 2010

У меня есть объект, основанный на типе ContentControl, и я хочу встроить пользовательские элементы управления в его содержимое.ниже приведен код.

проблема в том, что мне нужно, чтобы MyContainer имел список объектов MyControl, чтобы он мог с ними связываться, и каждому MyControl потребуется ссылка на свой MyContainer.

как это сделано правильно?один из способов, который я вижу, это объявить присоединенное свойство в MyControl и установить для него имя объекта MyContainer, но это кажется избыточным, поскольку объекты MyCOntrol могут искать в визуальном дереве, чтобы найти контейнер.если поиск является правильным способом сделать это, где бы я разместил код, который выполняет поиск?в конструкторе MyControl?

спасибо за любой ввод konstantin


public class MyContainer : ContentControl
{
...
}

public class MyConrol : Control
{
...
}

<c:MyContainer>
  <Grid>
    <c:MyControl />
  </Grid>
</c:MyContainer>

1 Ответ

0 голосов
/ 04 ноября 2010

Вы можете добавить свойство MyControls в класс MyContainer, создать шаблон для MyContainer со списком в нем (ItemsControl, ListBox или другим элементом управления списком), поместить сам список в сетку.из вашего примера кода свяжите свойство ItemsSource со списком MyControls.

Чтобы получить контейнер для элемента управления в XAML, вы можете использовать привязку с RelativeSource, установленным в FindAncestor.

Если вывам нужно найти контейнер из кода, вам, вероятно, следует делать это каждый раз или кэшировать значение при первом использовании (можно ли переместить элементы управления в другой контейнер?).Contructor не является подходящим местом, потому что сначала создается элемент управления, и только затем он помещается в дерево.

Присоединенные свойства определенно не нужны.

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