powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Команда срабатывает не на том UserControl, который ожидался
16 сообщений из 16, страница 1 из 1
Команда срабатывает не на том UserControl, который ожидался
    #38057782
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.

в WPF создал простой пользовательский контрол, который выглядит так:



К кнопке привязал команду:
Код: xml
1.
2.
3.
4.
5.
6.
7.
<UserControl.CommandBindings>
	<CommandBinding Command="New" Executed="CommandBinding_Executed" CanExecute="CommandBinding_CanExecute"/>
</UserControl.CommandBindings>
...
<Button x:Name="btnAdd" x:FieldModifier="public" ToolTip="Add record" Command="New" CommandParameter="{Binding}">
	<Image Source="/AcadLoadManager;component/Icons/bullet_sparkle.png" Width="16"/>
</Button>


Экземпляры этого контрола я использую во многих местах (на скрине обведены красным цветом):



Причём второй и третий экземпляры в свою очередь входят в состав др. контрола (на скрине обведён зелёным цветом).

Начал писать код обработки команды (в классе моего UserControl):

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e) {
	ItemsControl control = (ItemsControl)sender;			
	String name = control.Name;
	switch (name) {
		case "bundleList": {
				ObservableCollection<BundleWrapper> collection = 
					(ObservableCollection<BundleWrapper>)control.DataContext;
				Bundle bundle = new Bundle();
				bundle.DirectoryNamePrefix = "Hello World";
				collection.Add(new BundleWrapper(bundle));
				e.Handled = true;
				break;
			}
		case "pluginNameList": {
			BundleWrapper collection = (BundleWrapper)control.DataContext;
				break;
			}
		default:
			break;
	}			
}

private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e) {
	e.CanExecute = null != DataContext;
}


Но сразу столкнулся с проблемой: если я нажимаю на кнопку в среднем контроле (из показанных на скрине), то по факту событие срабатывает в левом - я вижу это по значению переменной name - оно всегда возвращает имя самого левого контрола из тех, что на скрине. Однако мне нужно получить именно тот мой пользовательский контрол, непосредственно в котором произошло нажатие на кнопку.

Что я сделал неправильно?

Спасибо
...
Рейтинг: 0 / 0
Команда срабатывает не на том UserControl, который ожидался
    #38057800
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для биндинга из XAML UserControl-а на "самого себя" удобно расширение разметки вроде:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    public class DocumentRootExtension : MarkupExtension
    {
        public DocumentRootExtension()
        { }

        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            // В дизайнере VS2010 этого сервиса нет 
            var rootObjectProvider = serviceProvider.GetService<IRootObjectProvider>();
            return rootObjectProvider != null ? rootObjectProvider.RootObject : null;
        }
    }



Заточено под WPF 4.

Использовать как-то так:
Код: xml
1.
2.
3.
<UserControl>
    <Button Command="{Binding SomeCommand, Source={my:DocumentRoot}}"/>
</UserControl>
...
Рейтинг: 0 / 0
Команда срабатывает не на том UserControl, который ожидался
    #38057805
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вдогонку:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
    public static class ServiceProviderHelper
    {
        public static T GetService<T>(this IServiceProvider provider)
        {
            return (T)provider.GetService(typeof(T));
        }

        public static T FindService<T>(this IServiceProvider provider)
            where T : class
        {
            var result = provider.GetService<T>();

            if (result == null)
                throw new ArgumentException(string.Format("Service {0} not found.", typeof(T).FullName));

            return result;
        }
    }
...
Рейтинг: 0 / 0
Команда срабатывает не на том UserControl, который ожидался
    #38057826
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правда вопрос немного не про это, ну да ладно...
...
Рейтинг: 0 / 0
Команда срабатывает не на том UserControl, который ожидался
    #38057831
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По теме: что мешает использовать человеческий RelayCommand?
...
Рейтинг: 0 / 0
Команда срабатывает не на том UserControl, который ожидался
    #38057840
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КДля биндинга из XAML UserControl-а на "самого себя"
Честно говоря я не понял, как это относится к обозначенной мною проблеме. У меня ведь не с привязкой сложности возникли... :)
...
Рейтинг: 0 / 0
Команда срабатывает не на том UserControl, который ожидался
    #38057845
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КПо теме: что мешает использовать человеческий RelayCommand?
Не пробовал пока это. А что не так в том что я показал выше? Я бы хотел по возможности использовать стандартные команды.
...
Рейтинг: 0 / 0
Команда срабатывает не на том UserControl, который ожидался
    #38057851
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum,

Я пока не вдавался глубоко.
Но явно тут дело не в RelayCommand.
...
Рейтинг: 0 / 0
Команда срабатывает не на том UserControl, который ожидался
    #38057853
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CompositumЯ бы хотел по возможности использовать стандартные команды.Не тот случай.
...
Рейтинг: 0 / 0
Команда срабатывает не на том UserControl, который ожидался
    #38057862
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum,

Есть подозрение во на что.
Логика работы с событиями тут другая - не такая как в Window Forms.
Посмотри в команде (в методе-обработчике) кто явлется реальным истоником события.

У тебя оплучается каждый твой контрол (один и тот же) имеет обработчи события.
Когда событие возникнет - оно пройдется по ним всем - если туннельное - то начнется с корневого элемента и до того элемента - котооые возбудило событие. И наоборот для пузырького события.
Поэтому для начала - глянь - кто является реальным истоничк возбуждения события
Тебе нужно OriginalSource глянуть. Более чем уверен что проблема именно в этом
...
Рейтинг: 0 / 0
Команда срабатывает не на том UserControl, который ожидался
    #38057890
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unknownfromrusТебе нужно OriginalSource глянуть. Более чем уверен что проблема именно в этом
Я смотрел это - указывает на Button. Но кнопка ведь определена в моём контроле, а мне получается, нужно получить имя экземпляра этого контрола, в котором и была нажата эта кнопка.
...
Рейтинг: 0 / 0
Команда срабатывает не на том UserControl, который ожидался
    #38057928
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum,

Ну так дальше обрабатывай собятия. У тебя их будет столько - сколько объявлено контролов. Если у тебя их 10 - то 10 раз будет запущен обработчик событий.
Если хочешь чтобы в самом первом обрботчике приходило именно твой контрол - то обрабатывай пузырькое событие а не туннельное (так как оно начинается на текущем эелменте и поднимается вверх)
...
Рейтинг: 0 / 0
Команда срабатывает не на том UserControl, который ожидался
    #38057937
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Млин... Написал простой пример (тестовый проект), в котором хотел показать проблему... Запустил - а там всё работает как нужно... Т.е. получаю имена тех объектов, которые ожидаются в обработке (вложенный файл)... :(
...
Рейтинг: 0 / 0
Команда срабатывает не на том UserControl, который ожидался
    #38058027
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заметил такой момент: если с ListBox моего UserControl есть элементы и я, прежде чем нажму кнопку, выделю элемент в списке, то возвращается правильное имя контрола.
...
Рейтинг: 0 / 0
Команда срабатывает не на том UserControl, который ожидался
    #38058033
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже на то, что работает корректно при условии, что контрол, на кнопке которого кликаю, владеет фокусом.
...
Рейтинг: 0 / 0
Команда срабатывает не на том UserControl, который ожидался
    #38058052
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Корректно работает и в том случае, если просто на заголовке списка кликнуть, прежде чем нажать кнопку. Но ведь это не дело... Я понимаю, что происходит какая-то маршрутизация снизу в верх, затем обратно, но я не понимаю, почему в этом не участвует настоящий виновник события, если он перед кликом по кнопке не был принудительно одарён фокусом?
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Команда срабатывает не на том UserControl, который ожидался
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]