簡體   English   中英

如何將子用戶控件中的按鈕鏈接到父級。 C#/ WPF

[英]How to link buttons in child user-control to parent. C# / WPF

我有一個WPF應用程序,也使用我設計的自定義控件。 在這個自定義控件中,我有一些按鈕,我想在父窗口中給出一些操作。

我怎樣才能做到這一點? 謝謝!

您需要將Buttons'Commands屬性公開為依賴項屬性。
假設您有一個自定義控件(與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>

然后在您的代碼中,您必須公開2個依賴項屬性: CommandForFirstButtonCommandForSecondButton (類型為ICommand):

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}"/>

編輯:對於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
    }

你以同樣的方式使用它。

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM