Привязка команд не работает, когда элемент управления хоста добавлен программно в wpf - PullRequest
3 голосов
/ 29 октября 2010

Это странно.У меня есть UserControl (MyControl) с кнопкой внутри.Я добавил команду к этой кнопке, целью команды которой является другой пользовательский элемент управления, который снова добавляется в то же окно.

Когда я статически добавляю UserControl в xaml к CustomControlхост-пространство, система CommandBinding работает нормально, где то же самое не работает, если UserControl добавлен программно (по событию Loaded этого окна).

В чем может быть причина.Я что-то здесь упускаю?!?

Обновление:

* Лучшее представление моих слов в виде изображения.Также я загрузил свой исходный код с помощью двоичных файлов @ https://code.google.com/p/commandbindingsample/ и

http://cid -6fc1e241d4534589.office.live.com / embedicon.aspx / Wpf% 20Samples / CommandBinding.zip (без версии) *

alt text

1 Ответ

1 голос
/ 02 ноября 2010

В вашем пользовательском контроле вы устанавливаете CommandBinding следующим образом:

CommandTarget="{Binding ElementName=userControl11}"

Если вы посмотрите в окне «Вывод» во время работы вашей программы, вы увидите следующее:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=userControl11'. BindingExpression:(no path); DataItem=null; target element is 'Button' (Name=''); target property is 'CommandTarget' (type 'IInputElement')

Это потому, что в текущей области имен нет элемента с именем userControl11. См. this для получения полной информации о том, как работают области имен XAML, но вкратце, имена XAML видны только на странице, в окне или пользовательском элементе управления, в котором они объявлены. Вы не можете ссылаться на объявленное имя в вашем окне изнутри пользовательского элемента управления.

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

public IInputElement CommandTarget
{
    get { return (IInputElement)GetValue(CommandTargetProperty); }
    set { SetValue(CommandTargetProperty, value); }
}

public static readonly DependencyProperty CommandTargetProperty =
        DependencyProperty.Register("CommandTarget", typeof(IInputElement), typeof(UserControl1), new UIPropertyMetadata(null));

и в пользовательском элементе управления XAML свяжите это свойство:

<Button Content="Click" 
        Command="local:Commands.ClickCommand" 
        CommandTarget="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=CommandTarget}" />

Я не могу заставить это работать в вашем проекте, но это потому, что я не могу понять ваш проект. Похоже, у вас есть два или три пользовательских элемента управления с именем UserControl1 в разных пространствах имен, а имена файлов в проекте не соответствуют их содержимому, и полезных комментариев не так уж много. (В общем, вместо того, чтобы говорить «это не работает», опишите поведение, которое вы ожидаете; это гораздо понятнее тому, кто пытается помочь вам, какова ваша настоящая проблема.)

Надеюсь, это в любом случае полезно.

...