繁体   English   中英

无法为DependencyProperty的ICommand设置默认值

[英]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库。

提前致谢。

编辑:

这是我的场景:

  1. 我主要使用UserControl而不绑定到此Command属性。

    ViewModel [不知道此命令] => View [不知道此命令] => UserControl [执行此命令的默认值]

  2. 但是对于一种情况,我需要从另一个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM