繁体   English   中英

向自定义控件添加命令以进行按钮绑定WPF

[英]adding commands to custom control for button binding wpf

我想在自定义控件中添加一个方法,可以在MainWindow.xaml中使用命令绑定从按钮调用该方法。 我在网上遇到了一些解决方案,但是其中一个似乎没有用,而另一个则可以。 有人可以向我解释设置此方法的正确方法。 第一个解决方案产生并产生错误,如下所述。 第二种解决方案有效,但是我不确定任何利弊。

解决方案1-损坏

public partial class MyControl : Control
{
    ...
    public static readonly RoutedCommand AlignLeftCommand = null;

    static MyControl()
    {
        binding = new CommandBinding();
        binding.Command = AlignLeftCommand;
        binding.Executed += new ExecutedRoutedEventHandler(AlignLeft_Executed);
        CommandManager.RegisterClassCommandBinding(typeof(MyControl), binding);
    }
}

错误:

严重性代码说明项目文件行错误CS0120非静态字段,方法或属性需要对象引用。

解决方案2

public partial class MyControl : Control
{
    ...
    public static readonly RoutedCommand AlignLeftCommand = new RoutedCommand();

    public MyControl()
    {
        this.CommandBindings.Add(new CommandBinding(MyControl.AlignLeftCommand, AlignLeft_Executed, null));
    }
}

这是调用方法的按钮。

<StackPanel Orientation="Horizontal">
    <Button Content="Left Edges" FontSize="8"
            Command="{x:Static JM:MyControl.AlignLeftCommand}"
            CommandTarget="{Binding ElementName=mycontrol}"/>
</StackPanel>

首先,您应该像这样在Window上定义命令绑定 (为ExecutedCanExecute事件创建处理程序):

<Window x:Class="CommandBindingWPF.MainWindow"
        ...The code omitted for the brevity...
        Title="MainWindow" Height="350" Width="525">
    <Window.CommandBindings>
        <CommandBinding Command="ApplicationCommands.New" Executed="CommandBinding_Executed" CanExecute="CommandBinding_CanExecute" />
    </Window.CommandBindings>

并声明您的Button ix xaml:

<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
    <Button Command="ApplicationCommands.New">New</Button>
</StackPanel>

命令绑定创建后,应在代码隐藏中创建处理程序:

private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
   MessageBox.Show("Hello from Command");
}

private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{      }

更新:

对于MVVM应用程序:

public class RelayCommand : ICommand
{
    #region Fields

    readonly Action<object> _execute;
    readonly Predicate<object> _canExecute;

    #endregion // Fields

    #region Constructors

    public RelayCommand(Action<object> execute)
        : this(execute, null)
    {
    }

    public RelayCommand(Action<object> execute, Predicate<object> canExecute)
    {
        if (execute == null)
            throw new ArgumentNullException("execute");

        _execute = execute;
        _canExecute = canExecute;
    }
    #endregion // Constructors

    #region ICommand Members

    public bool CanExecute(object parameter)
    {
        return _canExecute == null ? true : _canExecute(parameter);
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public void Execute(object parameter)
    {
        _execute(parameter);
    }

    #endregion // ICommand Members
}

然后在您的viewModel中创建一个属性。 例如:

public class YourViewModel
{
    public RelayCommand YourCommand { get; set; }
    public YourViewModel()
    {
        YourCommand = new RelayCommand(DoSmth, CanDoSmth);
    }

    private void DoSmth(object obj)
    {
        Message.Box("Hello from viewModel"); 
    }

    private bool CanDoSmth(object obj)
    {
       //you could implement your logic here. But by default it should be  
       //set to true
       return true;
    }
}

XAML应该看起来像:

<Button Content="Click me!" Command="{Binding YourCommand}"/> 

要了解MVVM,建议您阅读Rachel Lim的博客。 她有教人的才能,可以用简单的术语来解释。 阅读Rachel Lim的博客。 要了解MVVM命令, 请参阅该文章

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM