如何将子用户控件中的按钮链接到父控件.c# / wpf

本文关键字:控件 链接 wpf 按钮 用户 | 更新日期: 2023-09-27 18:16:59

我有一个WPF应用程序,它也使用了我设计的自定义控件。在这个自定义控件中,我有一些按钮,我想在父窗口中给它们一些动作。

我该怎么做呢?谢谢!

如何将子用户控件中的按钮链接到父控件.c# / wpf

你需要公开按钮的命令属性作为依赖属性。
假设你有一个自定义控件(它不同于UserControl),定义如下:

<Style TargetType="{x:Type custom:MyButtonedCtrl}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type custom:MyButtonedCtrl}">
                    <Border BorderThickness="4"
                            CornerRadius="2"
                            BorderBrush="Black">
                        <StackPanel>
                            <Button Command="{TemplateBinding CommandForFirstButton}"/>
                            <Button Command="{TemplateBinding CommandForSecondButton}"/>
                        </StackPanel>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

然后在后面的代码中,您必须公开两个依赖属性:CommandForFirstButtonCommandForSecondButton(类型为iccommand):

public class MyButtonedCtrl : ContentControl
    {
        static MyButtonedCtrl()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(MyButtonedCtrl), new FrameworkPropertyMetadata(typeof(MyButtonedCtrl)));      
        }
        #region CommandForFirstButton
        public ICommand CommandForFirstButton
        {
            get { return (ICommand)GetValue(CommandForFirstButtonProperty); }
            set { SetValue(CommandForFirstButtonProperty, value); }
        }
        // Using a DependencyProperty as the backing store for CommandForFirstButton.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty CommandForFirstButtonProperty =
            DependencyProperty.Register("CommandForFirstButton", typeof(ICommand), typeof(MyButtonedCtrl), new UIPropertyMetadata(null));
        #endregion
        #region CommandForSecondButton
        public ICommand CommandForSecondButton
        {
            get { return (ICommand)GetValue(CommandForSecondButtonProperty); }
            set { SetValue(CommandForSecondButtonProperty, value); }
        }
        // Using a DependencyProperty as the backing store for CommandForSecondButton.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty CommandForSecondButtonProperty =
            DependencyProperty.Register("CommandForSecondButton", typeof(ICommand), typeof(MyButtonedCtrl), new UIPropertyMetadata(null));
        #endregion
    }

当你想使用你的控件时:

        <custom:MyButtonedCtrl CommandForFirstButton="{Binding MyCommand}" 
                               CommandForSecondButton="{Binding MyOtherCommand}"/>

EDIT: For a UserControl:

声明如下:

<UserControl x:Class="MyApp.Infrastructure.CustomControls.MyButtonedCtrl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             x:Name="buttonedCtrl">
    <Grid>
        <Border BorderThickness="4"
                            CornerRadius="2"
                            BorderBrush="Black">
            <StackPanel>
                <Button Command="{Binding CommandForFirstButton, ElementName=buttonedCtrl}"/>
                <Button Command="{Binding CommandForSecondButton, ElementName=buttonedCtrl}"/>
            </StackPanel>
        </Border>
    </Grid>
</UserControl>

后面的代码是:

/// <summary>
    /// Interaction logic for MyButtonedCtrl.xaml
    /// </summary>
    public partial class MyButtonedCtrl : UserControl
    {
        public MyButtonedCtrl()
        {
            InitializeComponent();
        }
        #region CommandForFirstButton
        public ICommand CommandForFirstButton
        {
            get { return (ICommand)GetValue(CommandForFirstButtonProperty); }
            set { SetValue(CommandForFirstButtonProperty, value); }
        }
        // Using a DependencyProperty as the backing store for CommandForFirstButton.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty CommandForFirstButtonProperty =
            DependencyProperty.Register("CommandForFirstButton", typeof(ICommand), typeof(MyButtonedCtrl), new UIPropertyMetadata(null));
        #endregion
        #region CommandForSecondButton
        public ICommand CommandForSecondButton
        {
            get { return (ICommand)GetValue(CommandForSecondButtonProperty); }
            set { SetValue(CommandForSecondButtonProperty, value); }
        }
        // Using a DependencyProperty as the backing store for CommandForSecondButton.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty CommandForSecondButtonProperty =
            DependencyProperty.Register("CommandForSecondButton", typeof(ICommand), typeof(MyButtonedCtrl), new UIPropertyMetadata(null));
        #endregion
    }

用同样的方法。

希望这对你有帮助!