Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Динамическое добавление объектов в ComboBox и на Canvas в WPF

52K
26 апреля 2010 года
capflint
20 / / 16.02.2010
делаю так:
Код:
Hashtable Devices = new Hashtable();
           
           ComboBox cBox = new ComboBox();
           canvas.Children.Add(cBox);
           
           UserControl usercontrol = new UserControl();
           usercontrol.Name = "fr1";
           Devices.Add(usercontrol.Name, usercontrol);
           canvas.Children.Add(usercontrol);

           Binding binding = new Binding();
           binding.Mode = BindingMode.OneWay;
           binding.Source = this.Devices;
           binding.Path = new PropertyPath("Values");
           cBox.SetBinding(ComboBox.ItemsSourceProperty, binding);


Теперь при раскрытии списка cBox появляется исключение NullReferenceException. А если убрать строку: canvas.Children.Add(usercontrol);, то все работает гладко. Получается нельзя добавлять один и тот же объект и в хештайбл и на канвас. Это можно как-то обойти?
1.8K
26 апреля 2010 года
LM(AL/M)
332 / / 20.12.2005
Цитата: capflint
Получается нельзя добавлять один и тот же объект и в хештайбл и на канвас. Это можно как-то обойти?


дело не хэштэйбле и не в канвасе. дело в том как создаётся usercontrol. предполагаю что класс UserControl предназначен для наследования а не для прямого инстанцирования

52K
26 апреля 2010 года
capflint
20 / / 16.02.2010
Цитата: LM(AL/M)
дело не хэштэйбле и не в канвасе. дело в том как создаётся usercontrol. предполагаю что класс UserControl предназначен для наследования а не для прямого инстанцирования



так и есть. у меня есть класс, наследованный от UserControl. В проге я делаю примерно так:

 
Код:
class MyClass: UserControl
{ ... }

...
UserControl usercontrol = new MyClass();
//и т.д.

Сначала я думал, что дело в моем классе и сделал проще - заменил MyClass на UserControl.
 
Код:
UserControl usercontrol = new UserControl();

Но все равно не работает ни так, ни так.
52K
27 апреля 2010 года
capflint
20 / / 16.02.2010
Цитата: LM(AL/M)
что в stack-trace?



в System.Windows.Controls.Primitives.Popup.OnWindowResize(Object sender, AutoResizedEventArgs e)
в System.Windows.Interop.HwndSource.Resize(Size newSize)
в System.Windows.Interop.HwndSource.OnLayoutUpdated(Object obj, EventArgs args)
в System.Windows.ContextLayoutManager.fireLayoutUpdateEvent()
в System.Windows.ContextLayoutManager.UpdateLayout()
в System.Windows.ContextLayoutManager.UpdateLayoutCallback(Object arg)
в System.Windows.Media.MediaContext.InvokeOnRenderCallback.DoWork()
в System.Windows.Media.MediaContext.FireInvokeOnRenderCallbacks()
в System.Windows.Media.MediaContext.RenderMessageHandlerCore(Object resizedCompositionTarget)
в System.Windows.Media.MediaContext.RenderMessageHandler(Object resizedCompositionTarget)
в System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter)
в System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
в System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
в System.Windows.Threading.DispatcherOperation.InvokeImpl()
в System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
в System.Threading.ExecutionContext.runTryCode(Object userData)
в System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
в System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
в System.Windows.Threading.DispatcherOperation.Invoke()
в System.Windows.Threading.Dispatcher.ProcessQueue()
в System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
в MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
в MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
в System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter)
в System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
в System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
в System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Boolean isSingleParameter)
в System.Windows.Threading.Dispatcher.Invoke(DispatcherPriority priority, Delegate method, Object arg)
в MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
в MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
в System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
в System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
в System.Windows.Threading.Dispatcher.Run()
в System.Windows.Application.RunDispatcher(Object ignore)
в System.Windows.Application.RunInternal(Window window)
в System.Windows.Application.Run(Window window)
в System.Windows.Application.Run()
в WpfApplication2.App.Main() в D:\Программирование\C#\Projects\WpfApplication2\WpfApplication2\obj\Debug\App.g.cs:строка 0
в System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
в System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
в System.Threading.ThreadHelper.ThreadStart_Context(Object state)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
в System.Threading.ThreadHelper.ThreadStart()

489
28 апреля 2010 года
NeO_u
277 / / 11.10.2006
Ну, как бы тут проблема в том, что вы пытаетесь один и тот же контрол отобразить в разных местах - такого быть не может. Один объект контрола имеет одно место отображения. Если вы его разместили в Canvas, то не надо пытаться его разместить в комбобокс. Либо создайте байндинг, который будет через релатив соурс обращаться к канвасу, либо создайте новый объект контрола.
52K
28 апреля 2010 года
capflint
20 / / 16.02.2010
Цитата: NeO_u
Либо создайте байндинг, который будет через релатив соурс обращаться к канвасу, либо создайте новый объект контрола.



второй вариант отпадает сразу. а вот первый - все бы хорошо, только канвасов будет несколько, а в комбобоксе должны появиться все со всех канвасов.

489
28 апреля 2010 года
NeO_u
277 / / 11.10.2006
Ну сделайте на каждый канвас свой комбобокс, а элементы который в нем буду лежаться через какой-нибудь лист. И не забывайте. что для каждого нового комбо-бокса должен быть обязательно новый лист. Иначе процесс выбора в нескольких комбобоксах будет происходит одновременно.
52K
28 апреля 2010 года
capflint
20 / / 16.02.2010
я тут подумал... и решил. можно обойтись одним комбобоксом, тогда как мне сделать привязку?

 
Код:
UserControl usercontrol = new UserControl();
canvas.Children.Add(usercontrol);

ComboBox cBox = new ConboBox();

Binding binding = new Binding();
binding.Source = this.canvas;
binding.Path = new PropertyPath("Children");
cBox.SetBinding(ComboBox.ItemsSourceProperty, binding);


Последняя строка не срабатывает. Можно добавить
 
Код:
cBox.DisplayMemberPath = "Name";
тогда все работает, но в комбобоксе появляются имена объектов, а мне нужны сами объекты
489
28 апреля 2010 года
NeO_u
277 / / 11.10.2006
А зачем вы вообще используете байндинг для привязки контрола?

Как-то у вас все тяжело :) Можете в кратце описать задачу, которую пытаетесь решить?
52K
28 апреля 2010 года
capflint
20 / / 16.02.2010
можно и описать.
есть несколько устройств (наследованы от UserControl) и отдельных "компонентов". каждый компонент должен быть привязан к одному устройству. причем несколько компонентов может ссылаться на одно устройство. в настройках компонента должен появляться комбобокс со всеми устройствами для выбора привязки к устройству. вот мне и надо как-то формировать комбобокс
489
28 апреля 2010 года
NeO_u
277 / / 11.10.2006
Попробуйте следующее:
Код:
List<UserContol> lstConstrols = new List<UserControl>();

lstControls.Add(new UserControl(){Name = "Test"});

ComboBox cmb = new ComboBox();

Binding binding= new Binding
{
    ItemSsource = lstControls
};

cmd.DisplayMemberPath = "Name";

cmb.SetBinding(ComboBox.ItemsSourceProperty, binding);

foreach(UserControl userControl in lstControls)
    canvas.Add(userControl);


Либо:

Код:
canvas.Children.Add(new UserControl(){Name="Test"});

СomboBox cmb = new ComboBox();

Binding binding= new Binding
{
    ItemsSource = canvas.Children
};

cmd.DisplayMemberPath = "Name";

cmb.SetBinding(ComboBox.ItemsSourceProperty, binding);


Может там где-то и ошибки допущены, пишу без студии, но суть уловить можно :)
52K
28 апреля 2010 года
capflint
20 / / 16.02.2010
ну да. только вот опять же

 
Код:
cBox.DisplayMemberPath = "Name";


будет отображаться только имя. а мне надо, чтоб сам usercontrol
489
28 апреля 2010 года
NeO_u
277 / / 11.10.2006
Уберите DisplayMemberPath.
52K
28 апреля 2010 года
capflint
20 / / 16.02.2010
тогда опять выскакивает исключение NullReferenceException
489
28 апреля 2010 года
NeO_u
277 / / 11.10.2006
хм...NullReferenceException - говорит о том, что где-то у вас null передается.
Ищите где он.

А если DisplayMemberPath = "Name" - то что-то отображается или пустота?
52K
28 апреля 2010 года
capflint
20 / / 16.02.2010
отображается имя, но только когда список раскрыт[ATTACH]4221[/ATTACH]. а когда выбираю что-то, то в комбобоксе пусто[ATTACH]4222[/ATTACH]
489
28 апреля 2010 года
NeO_u
277 / / 11.10.2006
Был у меня такой глюк, если до завтра не решите, то скину завтра решение. Или объяснение этого глюка.
52K
28 апреля 2010 года
capflint
20 / / 16.02.2010
ок. буду ждать. спасибо заранее
52K
29 апреля 2010 года
capflint
20 / / 16.02.2010
ну вот. обещал сегодня объяснить решение моей проблемы и так и не появляется. :(
489
29 апреля 2010 года
NeO_u
277 / / 11.10.2006
В общем, вся проблема в этом DisplayMemberPath.

У меня такой же глюк был. При выбранном элементе ниче не отображается. Попробуйте добавить еще и SelectedValuePath - это должно помочь решить проблему с отображением.

У вас к комбобоксе никогда не будет отображаться userControl. Рисуйте его представление и используйте DisplayMemberPath, SelectedValuePath.

Надеюсь это поможет.
52K
29 апреля 2010 года
capflint
20 / / 16.02.2010
к сожалению не помогло. а на счет никогда не будет отображаться юзерконтрол я бы поспорил. дело в том, что до написания этого топика у меня получилось это сделать. проблема оставалась только в том, что юзерконтрол не выбирался (хотя в раскрытом списке были все). но потом я решел сделать получше (не буду долго объяснять, как именно), а получилось как всегда :(. и теперь я не могу повторить то, что уже делал. поэтому и обратился за помощью
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог