我为我的一个按钮实现了一个自定义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类中。
此外,我想在按钮中生成单击鼠标事件时触发此命令,以便我进行输入绑定,是否正确?
由于
答案 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完成之前没有将按钮状态更新为启用,直到我再次按下按钮?
感谢。