2016-12-03 4 views
0

Итак, я создал UserControl, который действительно является «расширенной кнопкой». Я реализовал свойства зависимостей, один из которых - ICommand, который, как предполагается, будет привязываться далее, когда управление используется в реальном окне.WPF C# Команды, связанные с userControl, не срабатывают

Однако по какой-то причине команда не работает.

Когда я попробовал точно такой же подход на обычной кнопке, все работало нормально (это не ошибка моей реализации DelegateCommand или моей ViewModel).

Я попытался следить за тем, почему связанная команда не срабатывает, но я не мог найти надежной причины для этого.

Вот мой UserControl XAML:

<Window x:Class="NoContact.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:NoContact" 
    mc:Ignorable="d" 
    xmlns:userControls="clr-namespace:NoContact.UserControls" 
    Title="MainWindow" Height="800" Width="960" Background="#22282a"> 
<Border BorderThickness="1" BorderBrush="#ffcd22" Margin="10,10,10,10"> 
<Grid> 
    <Button HorizontalContentAlignment="Stretch" Foreground="{Binding ElementName=ImageButtonUC, Path=Foreground}" 
      Background="{Binding ElementName=ImageButtonUC, Path=Background}"> 
     <DockPanel Width="{Binding ElementName=ImageButtonUC, Path=ActualWidth}"> 
      <Image Source="{Binding ElementName=ImageButtonUC, Path=Image}" DockPanel.Dock="Left" 
        Height="{Binding ElementName=ImageButtonUC, Path=ActualHeight, Converter={StaticResource HeightConverter}}" 
        Width="{Binding ElementName=ImageButtonUC, Path=ActualWidth, Converter={StaticResource HeightConverter}}" VerticalAlignment="Center"/> 
      <TextBlock Text="{Binding ElementName=ImageButtonUC, Path=Text}" FontSize="17" VerticalAlignment="Center" /> 
     </DockPanel> 
    </Button> 
</Grid> 
<UserControl.Resources> 
    <Style TargetType="{x:Type Button}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type Button}"> 
        <Border Background="{TemplateBinding Background}"> 
         <ContentPresenter Content="{TemplateBinding Content}" HorizontalAlignment="Center" VerticalAlignment="Center" /> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</UserControl.Resources> 

А вот мой UserControl кода позади:

public partial class ImageButton : UserControl 
{ 

    // OTHER IRRELEVANT CLASS PARAMETERS ARE HERE 

    public ICommand ClickCommand 
    { 
     get { return (ICommand)GetValue(ClickCommandProperty); } 
     set { SetValue(ClickCommandProperty, value); } 
    } 

    // OTHER IRRELEVANT DEPENDENCY PROPERTIES ARE HERE 

    public static DependencyProperty ClickCommandProperty = 
     DependencyProperty.Register("ClickCommand", typeof(ICommand), typeof(ImageButton)); 

    public ImageButton() 
    { 
     InitializeComponent(); 
    } 
} 

Наконец, это то, как я использую свой контроль:

<userControls:ImageButton x:Name="phoneButton" ClickCommand="{Binding Path=MyButtonClickCommand}" Style="{StaticResource phoneImageButtonUCStyle}" Text="Telefon" Width="200" Height="100" VerticalAlignment="Top" /> 

DataContext элемента управления установлен на панели стека, которая обернута вокруг моего элемента управления. Я также попытался установить его непосредственно на элемент управления, без эффекта.

Опять же, делать то же самое на обычной кнопке очень хорошо.

+0

Там, кажется, некоторые закрывающие теги, отсутствующие в вашем примере XAML. Попробуйте добавить их и сделать пример более «copy-pasteable», поэтому люди, пишущие ответы, могут просто скопировать вставку текущего состояния вашей проблемы. Оттуда легче начать выяснять решение :) – Teknikaali

+0

'Вот мой UserControl XAML: Will

ответ

0

Я, наконец, решил проблему - и это было довольно тривиально.

Я пропустил самое важное обязательство - кнопка UserControl Command для свойства зависимостей UserControl.

Изменение его, как это сделал его работу:

<Button HorizontalContentAlignment="Stretch" Foreground="{Binding ElementName=ImageButtonUC, Path=Foreground}" 
     Background="{Binding ElementName=ImageButtonUC, Path=Background}" 
     Command="{Binding ElementName=ImageButtonUC, Path=ClickCommand}">