[英]Can't set default value for ICommand of an DependencyProperty
我想从任何viewmodel调用UserControl
的命令。 在我看来,我试图绑定到Command,但是它没有用。
(我没有足够的声誉来发布图像,因此, 这是指向我的问题的图像表示的链接 )
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
这样,我就可以像这样在我的视图模型中调用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
[不知道此命令] => View
[不知道此命令] => UserControl
[执行此命令的默认值]
但是对于一种情况,我需要从另一个ViewModel
调用UserControl
此命令( CopyCommand
)。 我尝试坚持使用MVMM模式,因此我的ViewModel
不应意识到View
而是通过binding
到该命令并调用BindedToChangeVisibility.Execute();
来调用此命令BindedToChangeVisibility.Execute();
。
ViewModel
[ CopyOfCopyCommand.Execute(null)
] => View
[ CopyCommand={Binding CopyOfCopyCommand
}] => UserControl
[运行CopyCommand
(默认值)]
我刚刚做了一个UserControl,并遇到了同样的问题。 我为所有与UserControl相关的类等创建了一个类库,然后将其添加到主项目中。
为了解决您的问题,我创建了一个自己的命令类(在我的情况下)为DropDownControlCommands,其中包含实现中的所有ICommands。
然后,我将需要在项目中使用的某些事件绑定到DropDownControl和Control(在您的情况下为按钮)上。
当然,这不是最佳的解决方案,但它的效果很好,并且两个控件具有完全相同的命令/操作。
如果使用此解决方案,我建议您将“ DropDownControlCommands” -Class(无论如何称为“ DropDownControlCommands” -Class)添加到还包含控件的类库中。
这使它看起来有些结构化,如果您想在另一个项目中再次使用控件,那就太好了。
希望我能帮上忙。 不幸的是,我还没有找到更好的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.