自定义控件工具栏需要在我的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上创建CancelDelete方法。所以,视图的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有。

自定义控件工具栏需要在我的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的框架控件,您可以使用附加属性。