我想从任何视图模型中调用UserControl
的命令。我试图在我的视图中绑定到Command,但它不起作用。
(我没有足够的声誉来发布图片,所以here is a link to the image representation of my question)
View.xaml
<controls:SafeBox
Height="30"
VerticalAlignment="Center"
HorizontalAlignment="Stretch"
ShowCapsLockAlert="True"
ShowCopyCommand = "True"
CopyCommand="{Binding CopyCommandInVM}"
AllowClipboardCommands ="True"
WaterMark ="Enter your master password"/>
这样我只想以编程方式访问SafeBox的CopyCommand。
ViewModel.cs
#region [Command] CopyCommandInVM
public ICommand CopyCommandInVM
{
get
{
return _copyCommandInVM;
}
set
{
CopyCommandInVM = value;
}
}
private ICommand _copyCommandInVM;
#endregion
这样我就可以在我的viewmodel中调用UserControl的CopyCommand,如下所示:CopyCommandInVM.Execute(null)
;
UserControl.xaml
#region [Dependency Property] CopyCommand
public static readonly DependencyProperty CopyCommandProperty =
DependencyProperty.Register("CopyCommand",
typeof(ICommand),
typeof(SafeBox),
new FrameworkPropertyMetadata
{
DefaultValue= new RelayCommand(new Action<object>(Copy)),
DefaultUpdateSourceTrigger=UpdateSourceTrigger.PropertyChanged
}
);
[Bindable(true)]
[Category("Command")]
public ICommand CopyCommand
{
get
{
return (ICommand)GetValue(CopyCommandProperty);
}
set
{
this.SetValue(CopyCommandProperty, value);
}
}
/// <summary>
/// Static field, calls the Copy()
/// </summary>
/// <param name="obj"></param>
private static void Copy(object sender)
{
/* Not working:
var holder = obj as SafeBox;
holder.Copy();
how can I make it work or come up with another solution
to reach the holder of the dependency property (and call the method belown) */
}
/// <summary>
/// Copies the content of the SafeBox
/// </summary>
/// <param name="obj"></param>
private void Copy()
{
//...
}
#endregion
我的尝试无效,我无法在UserControl中找到该命令。
我在询问之前环顾了互联网,但找不到可绑定命令的一个好例子(默认值)。我不想使用任何MVMM库。
提前致谢。
修改:
这是我的场景:
我主要使用我的UserControl而不绑定到此Command属性。
ViewModel
[不知道此命令] =&gt;
View
[不知道此命令] =&gt;
UserControl
[执行此命令的默认值]
但是对于一种情况,我需要调用此命令(CopyCommand
)
来自另一个UserControl
的{{1}}。我试着坚持MVMM
模式,所以我的ViewModel
不应该知道ViewModel
但是要打电话
此命令通过View
发送给它并进行调用
binding
。
BindedToChangeVisibility.Execute();
[ViewModel
] =&gt;
CopyOfCopyCommand.Execute(null)
[View
}] =&gt;
CopyCommand={Binding CopyOfCopyCommand
[运行UserControl
(默认值)]
答案 0 :(得分:0)
我最近刚刚制作了一个UserControl并遇到了同样的问题。我创造了一个 所有UserControl相关类等的类库,然后将添加到主项目中。
为了解决您的问题,我创建了一个名为的自己的命令类 (在我的例子中)DropDownControlCommands,它包含所有带有实现的ICommands。
然后我绑定了一些事件,我需要在我的项目中使用,DropDownControl和Control(在你的情况下是按钮)。
当然,这不是最好的解决方案,但它的效果很好 控件具有完全相同的命令/操作。
如果您使用此解决方案,我建议您将“DropDownControlCommands”类(然后可以调用它)添加到类库中,该类库也包含您的控件。
这使它看起来更有条理,如果你想在另一个项目中再次使用你的控件,那就太棒了。
我希望我能提供帮助。不幸的是,我还没有找到更好的解决方案。