Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > добавление объека в список, на панель и в ComboBox


Автор: Capflint 28.4.2010, 15:50
проблема:

есть несколько UserControl'ов, которые находятся на панели Canvas, и несколько FrameworkElement'ов. каждый FrameworkElement хранит ссылку на UserControl. причем несколько FrameworkElement могут ссылаться на один UserControl.
для выбора на какой UserControl ссылаться, есть ComboBox, в котором должны отображаться все UserControl'ы. как это сделать?

пробывал так:
Код
UserControl usercontrol = new UserControl();
usercontrol.Name = "uc1";
canvas.Children.Add(usercontrol);
ComboBox combobox = new ComboBox();
canvas1.Children.Add(combobox);
Binding binding = new Binding();
binding.Source = canvas;
binding.Path = new PropertyPath("Children");
combobox.SetBinding(ComboBox.ItemsSourceProperty, binding);


При раскрытии списка возникает исключение NullReferenceException. Если добавить строку

Код

combobox.DisplayMemberPath = "Name";


то в раскрытом списке появляется имя UserControl (uc1) http://ipicture.ru/Gallery/Viewfull/142747.html, но при выборе элемента списка combobox пуст http://ipicture.ru/Gallery/Viewfull/142755.html. но все равно это не выход. так должно отображаться имя UserControl'а, а мне нужен его внешний вид (сам UserControl). 

Помогите кто может!!!!! smile 

Автор: Sartorius 28.4.2010, 16:13
Зачем все в коде пишете? Сбиндите в XAML-е ItemsSource у комбобокса к ObservableCollection ваших контролов 

Код

<ComboBox  ItemsSource="{Binding MyControls, Mode=OneWay}"/>


ЗЫ 
 Один инстанс контрола может только один раз в дереве видимости появляться

Автор: Capflint 28.4.2010, 21:50
Цитата(Sartorius @  28.4.2010,  16:13 Найти цитируемый пост)
Зачем все в коде пишете? 

потому что все будет происходить динамически: добавление контролов, формирование списка и даже создание канваса. да и вообще, я просто сишный код лучше воспринимаю, чем xaml. не привык еще.

Цитата(Sartorius @  28.4.2010,  16:13 Найти цитируемый пост)
Сбиндите в XAML-е ItemsSource у комбобокса к ObservableCollection ваших контролов

если можно немного поподробнее. какая разница к какой коллекции будет привязка: UIElementCollection или ObservableCollection. а может List<T> или Hashtable?

Цитата(Sartorius @  28.4.2010,  16:13 Найти цитируемый пост)
Один инстанс контрола может только один раз в дереве видимости появляться

тогда получается, что задача не решаема? 

Автор: Sartorius 29.4.2010, 12:12
Цитата(Capflint @  28.4.2010,  22:50 Найти цитируемый пост)
если можно немного поподробнее. какая разница к какой коллекции будет привязка

ObservableCollection умеет уведомлять подписчиков об изменениях (добавление, удаление элементов). Если после биндинга менять коллекцию не собираетесь - подойдет все что реализует IEnumerable

Цитата(Capflint @  28.4.2010,  22:50 Найти цитируемый пост)
тогда получается, что задача не решаема? 

Нужно создать копию контрола и добавлять в комбо ее

Автор: Capflint 29.4.2010, 12:19
Цитата(Sartorius @  29.4.2010,  12:12 Найти цитируемый пост)
ObservableCollection умеет уведомлять подписчиков об изменениях (добавление, удаление элементов)

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

Цитата(Sartorius @  29.4.2010,  12:12 Найти цитируемый пост)
Нужно создать копию контрола и добавлять в комбо ее

как это сделать. после добывления контрола в окно, он может поменять целую кучу свойств (цвет фона, границы, надписи или какие-то свои). а надо, чтоб добавлялся контрол именно такой, какой он есть в данный момент

Автор: Sartorius 29.4.2010, 12:50
Цитата(Capflint @  29.4.2010,  13:19 Найти цитируемый пост)
а надо, чтоб добавлялся контрол именно такой, какой он есть в данный момент 

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

Автор: Capflint 29.4.2010, 12:52
а как тогда быть? может предложите свой способ?

П.С. в принципе, можно сделать и вообще без привязки данных
Код

combobox.ItemsSource = canvas.Children;

Не знаю зачем вообще я привязку сюда влепил

Автор: Sartorius 29.4.2010, 13:03
Цитата(Capflint @  29.4.2010,  13:52 Найти цитируемый пост)
а как тогда быть? может придложите свой способ?
 
Если нужно изображение контрола в комбо, можно использовать WritableBitmap http://blogs.microsoft.co.il/blogs/alex_golesh/archive/2009/03/19/silverlight-3-quick-tip-1-how-to-use-writablebitmap.aspx
Рендерим контрол в него, ресайзим как надо (типа thumbnail-а получается) и сорцем в Image, а Image в комбо. Как-то так

Автор: Capflint 29.4.2010, 13:13
Спасибо за помощь. я думаю это поможет. но есть еще вопрос:
Цитата(Capflint @  28.4.2010,  15:50 Найти цитируемый пост)
При раскрытии списка возникает исключение NullReferenceException. Если добавить строкукод C#1:combobox.DisplayMemberPath = "Name";highlightSyntax('csharp_ZDkyMm','csharp');то в раскрытом списке появляется имя UserControl (uc1) , но при выборе элемента списка combobox пуст .

может сталкивались с этим или знаете в чем причина?


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)