Как связать кнопки в дочернем элементе управления с родительским.C # / WPF - PullRequest
1 голос
/ 06 декабря 2011

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

как я могу это сделать? спасибо!

1 Ответ

4 голосов
/ 06 декабря 2011

Вам необходимо представить свойства команд кнопок как свойства зависимостей.
Скажем, у вас есть пользовательский элемент управления (который отличается от 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 свойства зависимости: CommandForFirstButton и CommandForSecondButton (типа 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
    }

ИВы используете его так же.

Надеюсь, это поможет!

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