WPF ICommand一个按钮

时间:2010-03-29 10:56:34

标签: wpf button icommand

我为我的一个按钮实现了一个自定义IComand类。该按钮位于“MyPage.xaml”页面中,但其自定义ICommand类放在另一个类中,而不是放在后面的MyPage代码中。然后从XAML我想用自定义命令类绑定按钮,然后我做:

MyPage.xaml:

    <Page ...>

         <Page.CommandBindings>
             <CommandBinding Command="RemoveAllCommand"
                CanExecute="CanExecute"
                Executed="Execute" />
         </Page.CommandBindings>

         <Page.InputBindings>
                <MouseBinding Command="RemoveAllCommand" MouseAction="LeftClick" />
         </Page.InputBindings>

             <...>
               <Button x:Name="MyButton"  Command="RemoveAllCommand" .../>
             <...>

    </Page>

和自定义命令按钮类:

// Here I derive from MyPage class because I want to access some objects from 
// Execute method
public class RemoveAllCommand : MyPage, ICommand 
{

    public void Execute(Object parameter)
    {
        <...>
    }

    public bool CanExecute(Object parameter)
    {
        <...>
    }


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

}

我的问题是如何说MyPage.xaml按钮的Execute和CanExecute方法在另一个类而不是放置按钮的后面的代码。怎么说这些方法都在XAML页面的RemoveAllCommand类中。

此外,我想在按钮中生成单击鼠标事件时触发此命令,以便我进行输入绑定,是否正确?

由于

3 个答案:

答案 0 :(得分:1)

由于你有一个ICommand,你可以通过Command属性将它绑定到Button,按钮将使用它,即它会调用CanExecute来启用/禁用它自己和按下按钮时的Execute方法。不需要任何其他输入绑定。

现在的问题是该按钮必须找到该命令。一个简单的解决方案是将命令的实例放在按钮(或其父项)的DataContext中。

如果DataContext有一个名为RemoveAll的属性,类型为RemoveAllCommand,则只需将XAML按钮更改为:

<Button Command="{Binding RemoveAll}" .. />

并删除CommandBinding和InputBinding

答案 1 :(得分:0)

嘿,我已经完成了但没有成功,我在构建项目时收到错误:无法创建类型为RemoveAllCommand的实例。

我做到了:

MyPage.xaml(我已从页面中删除了CommandBinding和InputBinding):

<Page  x:Class="GParts.Pages.MyPage" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;
assembly=PresentationFramework.Aero"            
xmlns:Classes="clr-namespace:GParts.Classes"   
xmlns:Pages="clr-namespace:GParts.Pages">

<Page.Resources>
      <...>
         <Pages:RemoveAllCommand x:Key="RemoveAllCommandInstance"/>
      <...>
</Page.Resources>

<...>
<Button Command="{Binding RemoveAllCommandInstance}" ...>  
<...>
</Page>

在自定义Icommand类中,我添加了一个没有参数的构造函数:

public class RemoveAllCommand : MyPage, ICommand 
{

    public RemoveAllCommand() { }

    ...
}

感谢。

答案 2 :(得分:0)

哦,谢谢,明天我会试试。

现在为了避免问题,我已将RemoveAllCommandClass Class中的所有内容移动到MyPage后面的代码中,并且我做了一些修改。

1.-我将此添加到MyPage.xaml:

的xmlns:本地= “CLR-名称空间:GParts”

然后我做了:

<Page.CommandBindings>
    <CommandBinding Command="{x:Static local:Pages.MyPage._routedCommand}"
               Executed="Execute"
               CanExecute="CanExecute"/>
</Page.CommandBindings>


<Button Command="{x:Static local:Pages.MyPage._routedCommand}"  .../>

一切都好,有效。当我按下按钮时,它执行在Execute方法中调用的后台工作程序(bw)。 bw进入另一个班级。在后台工作者类中,我有一个变量(isRunning),指示bw是否正在执行。在执行DoWork事件之前,我将其设置为true,当bw完成时,在RunWorkerCompleted处,我将其设置为false。所以从CanExecute我检查bw类中的isRunning,如果isRunning为false,我设置为true e.canExecute,如果isRunning为true,则设置为e.canExecute为false。因此,当bw正在运行时,WPF会自动禁用该按钮,但是当bw完成时,该按钮将继续禁用,直到我再次按下该按钮才会返回启用状态。为什么WPF在bw完成之前没有将按钮状态更新为启用,直到我再次按下按钮?

感谢。