这是我的问题。我有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个方法(按惯例命名)。
任何指针?
修改
主要问题是如何使用programmaticaly BIND命令或方法来按钮。我理解命令如何工作,我正在使用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");
显然第3行是错的,但这就是我想要的。我希望能够硬编码包含我希望VM拥有的命令名称的字符串。
答案 0 :(得分:0)
通常,这种事情可以使用命令完成。对于已经具有“Command”DependencyProperty的Button控件,它就像这样简单:
<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)
{
// ...
这是here的一个很好的例子。在自定义控件上,您可以自己声明Command DependencyProperty。在没有Command DependencyProperty的框架控件上,您可以使用attached property。