绑定到userControl的WPF C#命令不会被激活

时间:2016-12-03 22:30:22

标签: c# wpf mvvm user-controls icommand

所以,我创建了一个UserControl,它实际上是一个"高级按钮"。 我已经实现了依赖属性,其中一个是ICommand,当在实际的Window中使用控件时,它应该是可绑定的。

但是,由于某种原因,命令不起作用。

当我在常规按钮上尝试完全相同的方法时,一切正常(因此它不是我的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设置在stackpanel上,它围绕着我的控件。我也试过直接在控件上设置它,没有效果。

再次,在常规按钮上执行相同操作就可以了。

1 个答案:

答案 0 :(得分:0)

我终于解决了这个问题 - 这非常简单。

我已经省略了最重要的绑定 - UserControl的按钮Command to UserControl的Dependency属性。

像这样更改它使它工作:

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