Невозможно передать / привязать команду к пользовательскому элементу управления WPF - PullRequest
6 голосов
/ 31 октября 2011

Я пытаюсь передать команду элементу в пользовательском элементе управления WPF.

<UserControl x:Class="MyApp.MyControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <!-- shortened -->
    <Button Command="{Binding Command}">
        <Button.Content>
            <!-- shortened -->
        </Button.Content>
    </Button>
</UserControl>
public partial class MyControl : UserControl
{
   public static readonly DependencyProperty CommandProperty
      = DependencyProperty.Register("Command", 
                                           typeof(ICommand), typeof(MyControl));
   //shortened        
   public ICommand Command
   {
      get { return (ICommand)GetValue(CommandProperty); }
      set { SetValue(CommandProperty, value); }
   }
   //shortened
} 
<uc:MyControl Command="{Binding DoStuffCommand}" />  <!-- shortened -->

При нажатии кнопки в пользовательском элементе управления ничего не происходит.
При отладке свойство Command имеет значение null.
Привязка команды к кнопке вне пользовательского элемента управления работает.
Что здесь происходит?

Ответы [ 4 ]

8 голосов
/ 31 октября 2011

Значение по умолчанию DataContext для вашего Button - это DataContext вашего UserControl, а не UserControl, поэтому вы пытаетесь связать DataContext.Command вместо UserControl.Command

Для привязки к UserControl.Command, используйте RelativeSource привязку

<Button Command="{Binding Command, RelativeSource={
        RelativeSource AncestorType={x:Type local:MyControl}}}">  

РЕДАКТИРОВАТЬ Только что заметил ответ HB , который также будет работать.Обычно я предпочитаю привязки RelativeSource к привязкам ElementName, потому что иногда я переименовываю элементы и обычно забываю, какие другие элементы управления ссылаются на этот элемент по имени

5 голосов
/ 31 октября 2011

Назовите элемент управления и используйте ElementName:

<UserControl ...
             Name="control">
    <Button Command="{Binding Command, ElementName=control}">
    <!-- ... -->
0 голосов
/ 27 августа 2015

В общем, я всегда следую совету Рэйчел (например, один выше). Но в этом конкретном случае я бы рассмотрел установку DataContext в корневом элементе пользовательского элемента управления, тогда он сделал бы аккуратную привязку.

<Grid DataContext="{Binding RelativeSource={RelativeSource FindAncestor,
                            AncestorType={x:Type UserControl}}}">
<!-- shortened -->
    <Button Command="{Binding Command}">
        <Button.Content>
            <!-- shortened -->
        </Button.Content>
    </Button>
</Grid >
0 голосов
/ 31 октября 2011

Ну, я бы просто привязал команду к управлению / окну хоста.Потому что контекст данных будет унаследован от него.Примерно так.

<UserControl x:Class="MyApp.MyControl" 
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <!-- shortened --> 
    <Button Command="{Binding DoStuffCommand}"> 
        <Button.Content> 
            <!-- shortened --> 
        </Button.Content> 
    </Button> 
</UserControl>

Затем вы можете удалить код свойства зависимостей из файла выделенного кода.

И удалить привязку свойства команды,

<uc:MyControl />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...