Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Модификация DataTemplate 
V
    Опции темы
Idsa
Дата 28.8.2008, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 2
Всего: 62



В Xaml есть DataTemplate. Однако перед тем, как присвоить определенному элементу DataTemplate, мне необходимо его немного подправить (присвоить дополнительный Binding, который невозможно задать декларативно). Я получаю из ресурсов DataTemplate, но как получить определенный контрол этого DataTemplate - не пойму. Судя по сигнатуре метода DataTemplate.FindName, обращаться к элементам DataTemplate можно только для конкретного инстанса. Как быть?

Это сообщение отредактировал(а) Idsa - 28.8.2008, 14:01


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Idsa
Дата 28.8.2008, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 2
Всего: 62



Вроде бы нашел работающее решение: http://blogs.msdn.com/scmorris/archive/200...at-runtime.aspx (заголовок Defining a DataGrid Template Column / Dynamic).
Однако я все еще готов выслушать ваши предложения smile

Это сообщение отредактировал(а) Idsa - 28.8.2008, 14:02


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Idsa
Дата 31.8.2008, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 2
Всего: 62



Не понравился мне этот метод... Во-первых, генерировать код из xaml'а на лету - дорого, во-вторых при таком подходе в xaml'е не должно быть обработчиков событий (а это не есть гуд).

Решил выбрать альтернативный вариант - создать DataTemplate через код. Нашел мануальчик - сделал. Да вот только почему-то WPF DataGrid ругается в духе "для этого DataTemplate IsSealed должно быть True". Мне стало интересно, а нельзя ли подсмотреть, в какой код превращается тот DataTemplate, который я создавал в xaml. Было бы замечательно увидеть разницу и понять, что же я сделал не так.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Idsa
Дата 1.9.2008, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 2
Всего: 62



Вот точная формулировка ошибки: user posted image


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Idsa
Дата 5.9.2008, 07:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 2
Всего: 62



Уже вырисовывается целая детективная история, а решения все нет.
Итак, понадобилось мне создать динамический DataTemplate для WPF DataGrid.
Сначала решил воспользоваться методом XamlReader.Load. Однако при использовании этого подхода в xaml не должно быть обработчиков (а мне они были нужны). Банальный workaround - присвоить обработчики элементам (в случае грида - ячейкам) после применения DataTemplate. Однако оказалось, что в WPF DataGrid нет возможности обратиться к определенной строке или ячейке. Подробнее об этом - здесь: http://forums.msdn.microsoft.com/en-US/wpf...91-c54560805452. Так что с этим подходом у меня вышел облом.
Второй способ - создавать DataTemplate через код. Как я писал выше, при реализации этого подхода у меня вылетал Exception с информацией о том, что DataTemplate должен быть Sealed. Один из разработчиков DataGrid здесь посоветовал мне вызвать метод Seal для DataTemplate. Я уж было обрадовался, думаю, вот он мой спаситель... но где уж там. После того, как я последовал рекомендации, Exception перестал вылетать, но вместе с ним перестали срабатывать обработчики событий. Судя по описанию метода Seal в MSDN:
Цитата

Locks the template so it cannot be changed. 

в этом нет ничего странного. Хотя в целом мне непонятно, почему при создании DataTemplate через xaml все ок, а через код - куча проблем.
Пока я надеюсь на то, что разработчики DataGrid еще отпишутся и выручат меня, либо исправят эту багу (если это не моя бага smile ) в релизе, который намечается совсем скоро.
Эх...


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Idsa
Дата 8.9.2008, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 2
Всего: 62



Решил проблему, перейдя на Xceed DataGrid Express. Также, благодаря переходу, решилась и еще одна проблема: http://forum.vingrad.ru/forum/topic-226406.html


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
namespace
Дата 20.11.2008, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 4.7.2006

Репутация: нет
Всего: нет



и мне необходимо получить контрол  smile 
у меня есть ListBox, элементами которого являются ComboBox, в  общем мне нужно каждому ComboBox дать ItemsSource
попробую создать ListBox из кода ...
PM MAIL   Вверх
Partizan
Дата 21.11.2008, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



А как на счёт того, чтобы генерить DataTemplate в code-behind?


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
namespace
Дата 21.11.2008, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 4.7.2006

Репутация: нет
Всего: нет



я сделал проще, создал свой контрол в виде StackPanel а в ней уже ComboBox-ы
PM MAIL   Вверх
DenWPF
Дата 16.10.2009, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



Так и не понял как эта проблема решается,
что вобоещ у меня есть.
Код

<Grid>
<Grid.Resources>
            <DataTemplate DataType="thumbnail" x:Key="datatemplate">
                        <StackPanel HorizontalAlignment="Stretch" >
                            <Image x:Name="image"/>
                            <TextBlock FontWeight="Bold"><Run Text="Имя:"/></TextBlock>
                            <TextBox TextWrapping="Wrap" Text="{Binding XPath=@filename}" />
            <TextBlock FontWeight="Bold"><Run Text="Сылка:"/></TextBlock>
                        </StackPanel>
            </DataTemplate>
            
</Grid.Resources>
<ListBox ItemsSource="{Binding Mode=OneWay}" x:Name="listBox" >
</Grid>


я хочу оставить лист бокс и DataTemplate убрать и написать его кодом. как это сделать?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.1232 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.