无法为DependencyProperty的ICommand设置默认值

时间:2015-12-13 11:43:28

标签: c# wpf data-binding icommand

我想从任何视图模型中调用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库。

提前致谢。

修改:

这是我的场景:

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

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

  2. 但是对于一种情况,我需要调用此命令(CopyCommand) 来自另一个UserControl的{​​{1}}。我试着坚持MVMM 模式,所以我的ViewModel不应该知道ViewModel但是要打电话 此命令通过View发送给它并进行调用 binding

    BindedToChangeVisibility.Execute(); [ViewModel] =&gt; CopyOfCopyCommand.Execute(null) [View}] =&gt; CopyCommand={Binding CopyOfCopyCommand [运行UserControl(默认值)]

1 个答案:

答案 0 :(得分:0)

我最近刚刚制作了一个UserControl并遇到了同样的问题。我创造了一个 所有UserControl相关类等的类库,然后将添加到主项目中。

为了解决您的问题,我创建了一个名为的自己的命令类 (在我的例子中)DropDownControlCommands,它包含所有带有实现的ICommands。

然后我绑定了一些事件,我需要在我的项目中使用,DropDownControl和Control(在你的情况下是按钮)。

当然,这不是最好的解决方案,但它的效果很好 控件具有完全相同的命令/操作。

如果您使用此解决方案,我建议您将“DropDownControlCommands”类(然后可以调用它)添加到类库中,该类库也包含您的控件。

这使它看起来更有条理,如果你想在另一个项目中再次使用你的控件,那就太棒了。

我希望我能提供帮助。不幸的是,我还没有找到更好的解决方案。