2013-02-20 1 views
0

Это более общий вопрос ... У меня есть пользовательский элемент управления, который я написал (UserControl, а не Custom Control). Я использую этот контроль в виде DataGridColumn, чтобы обеспечить поиск functionality..much так:Создается ли пользовательский элемент управления каждый раз при изменении данных datacontext?

   <DataGridTemplate ColumnHeader="Company"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <lookupCtl:LookUpCTL SelectedCompany="{Binding Company, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
              CompanyChangedCommand="{Binding DataContext.CompanyChangedCmd, RelativeSource={RelativeSource AncestorType=DataGrid}}"/> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 

То, что я заметил, что всякий раз, когда изменяется dataconext для/содержащего управления родительским, конструктор LookUpCTL является называется. Это ожидаемое поведение? В любом случае, чтобы предотвратить это? поскольку я не понимаю, почему это необходимо ... единственный экземпляр элемента управления должен быть в состоянии обновить себя из datacontext, который я думаю.

Редактировать: googling не дает четких ответов ... но из того, что я прочитал, это может быть проблема с Datagrid. поскольку мой элемент управления используется в datagrid, каждый раз, когда изменяется элемент items сетки, он уничтожает и воссоздает элементы управления? я вижу смысл в том, что он делает это ... но не уверен, что это причина того, что я вижу. Предполагая, что это ... есть ли способ, чтобы экземпляры повторного использования datagrid пользовательского управления вместо того, чтобы создавать новые, когда изменяется источник данных datagrid?

ответ

0

По-видимому, причина, по которой пользовательские элементы управления, используемые в качестве столбцов DataTemplate для datagrid, уничтожаются и воссоздаются при изменении источника items для datagrid. в моем случае решение состояло в том, чтобы использовать обычную сетку, учитывая, что у меня всегда было 4 элемента в моем списке, которые использовались в качестве источника данных для сетки. Это не идеальное решение, а не решение для списков N-элементов ... но в моем случае это значительно улучшило производительность, так как мой пользовательский контроль выполнял некоторые интенсивные поиски баз данных для инициализации для кэширования данных.

+0

Получение данных из базы данных и кэширование не является ответственностью представления. Это похоже на хаки, обычно встречающиеся в winforms. Если бы у вас была правильная архитектура, у вас не было бы необходимости прибегать к этому, потому что пользовательскому управлению вообще не нужно было ничего делать при создании. –

+0

полезно .. запишите архитеку из 5 строк xaml. контроль позволяет потребителям предоставлять данные через адаптеры/провайдеры. он отображает данные с использованием иерархических шаблонов для группировки до 4 уровней. его довольно эффективный при этом заданный размер данных. контроль не является проблемой. это шаблон, который использует эти элементы управления. когда пользователь выбирает из главного списка, изменяется источник itemstatatrid. поскольку ctl является столбцом шаблона сетки данных, он воссоздается. Это проблема. у вас есть решение? или просто широкая критика из 5 строк xaml? – mike01010

+0

Мне все равно, если вы создаете всю оболочку Windows Explorer.exe внутри пользовательского элемента управления. Тем не менее, получение данных из базы данных и кэширование не несет ответственности за представление. Вы когда-нибудь слышали о [Разделение проблем] (http://en.wikipedia.org/wiki/Separation_of_concerns)? это довольно новая концепция, поэтому я понимаю, что вы никогда не слышали об этом раньше. Это было с 1975 года или что-то в этом роде. –

Смежные вопросы