自定义控件工具栏需要在我的VM上调用方法.怎么做呢?
本文关键字:方法 调用 工具栏 VM 我的 自定义控件 | 更新日期: 2023-09-27 18:18:55
我的问题是。我有UserControl
包装一组按钮,它看起来像这样:(我显示了2个按钮来说明它是什么)
<Button Content="Cancel"
IsEnabled="{Binding State, Converter={StaticResource CancelEnabledConverter}}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<ei:CallMethodAction MethodName="Cancel" TargetObject="{Binding}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
<Button Content="Delete"
IsEnabled="{Binding State, Converter={StaticResource DeleteEnabledConverter}}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<ei:CallMethodAction MethodName="Delete" TargetObject="{Binding}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
现在,当我将这个UserControl
放在我的视图中时-我按照惯例在我的VM上创建Cancel
和Delete
方法。所以,视图的XAML看起来很干净。
我想创建自定义控件,将具有相同的功能。在控制内部,我将不得不处理按钮的onClick
事件,并希望在VM上调用方法,就像它现在工作一样。我的代码会是什么样子?我想我需要以编程方式访问DataContext
,并以某种方式按名称调用方法。我设想这样使用控件:
<myToolBar Mode="SaveExitDelete" />
那么,这将是很好的和简短的。但是myToolBar
将显示3个按钮,这些按钮将在DataContext上调用3个方法(按约定命名)。
指针吗?
编辑
主要问题是如何通过编程将命令或方法绑定到按钮。我了解命令是如何工作的,我正在使用PRISM,它有内置的我可以使用的DelegateCommand。当我知道方法名称或命令名称时,我不知道如何以编程方式创建绑定。
我可以看到它是如何工作的:
var button = new DitatToolbarButton();
button.Caption = "Cancel &'nExit";
button.Icon = new BitmapImage(new Uri("img_btn_cancel.png", UriKind.Relative));
button.Command = Binding("CancelCommand");
显然第三行是错误的,但这是我想要的。我希望能够硬编码字符串,将包含命令的名称,我将期望VM有。
通常,这类事情将通过命令完成。在Button控件的情况下,它已经有"Command"DependencyProperty,它就像这样简单:
<Button Command="{Binding DoItCommand}">Do it</Button>
和在视图模型类中:
private ICommand DoItCommand
{
get
{
return new DelegateCommand(param => DoIt(param), param => CanDoIt(param));
}
}
其中DoIt()和CanDoIt()是视图模型中的方法,而DelegateCommand是这样定义的:
public class DelegateCommand : ICommand
{
public DelegateCommand(Action<object> execute, Predicate<object> canExecute)
{
// ...
这里有一个很好的例子。在自定义控件上,您可以自己声明Command DependencyProperty。对于没有Command DependencyProperty的框架控件,您可以使用附加属性。