- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用 ApplicationCommands。剪切、复制、粘贴、保存...它们看起来很有趣,因为命令路由、键绑定(bind)以及某些控件使用它们的事实。我了解如何绑定(bind)到我的 VM 上的中继/委托(delegate)命令,但我似乎无法理解应用程序命令。我找到了几个旧答案,但没有其他信息,我有点不愿意遵循这些路线。
这似乎很常见,但信息似乎非常有限。这通常是如何实现的? (使用或不使用 PRISM、MVVM Light……)
旧答案:
How to bind ApplicationCommands to a ViewModel但是使用行为来解决这个问题对我来说似乎很奇怪
WPF - Handle an ApplicationCommand in the ViewModel但我不认为这是公认的答案中的 MVVM。
在旧文章中使用附加属性:CommandBindings with MVVM引用另一篇文章。
最佳答案
我问这个问题已经有一段时间了,但看起来很多人都在看这个问题。我最终使用了一种将 VM 命令列表连接到 FrameworkElement 的行为。这似乎是最灵活和可重复使用的解决方案。
public class AttachCommandBindingsBehavior : Behavior<FrameworkElement>
{
public ObservableCollection<CommandBinding> CommandBindings
{
get
{
return (ObservableCollection<CommandBinding>)GetValue(CommandBindingsProperty);
}
set
{
SetValue(CommandBindingsProperty, value);
}
}
public static readonly DependencyProperty CommandBindingsProperty = DependencyProperty.Register("CommandBindings", typeof(ObservableCollection<CommandBinding>), typeof(AttachCommandBindingsBehavior), new PropertyMetadata(null, OnCommandBindingsChanged));
private static void OnCommandBindingsChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
AttachCommandBindingsBehavior attachCommandBindingsBehavior = (AttachCommandBindingsBehavior)sender;
if (attachCommandBindingsBehavior == null)
return;
ObservableCollection<CommandBinding> commandBindings = (ObservableCollection<CommandBinding>)e.NewValue;
if (commandBindings != null)
{
if (attachCommandBindingsBehavior.CommandBindings != null)
attachCommandBindingsBehavior.CommandBindings.CollectionChanged -= attachCommandBindingsBehavior.CommandBindings_CollectionChanged;
attachCommandBindingsBehavior.CommandBindings.CollectionChanged += attachCommandBindingsBehavior.CommandBindings_CollectionChanged;
}
}
void CommandBindings_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
ObservableCollection<CommandBinding> collection = (ObservableCollection<CommandBinding>)sender;
if (collection != null)
{
foreach (CommandBinding commandBinding in collection)
AssociatedObject.CommandBindings.Add(commandBinding);
}
}
}
然后在 xaml 中你可以这样做:
<i:Interaction.Behaviors>
<localBehaviors:AttachCommandBindingsBehavior CommandBindings="{Binding CommandBindings}"/>
</i:Interaction.Behaviors>
关于c# - 如何在 MVVM 中使用 ApplicationCommand,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35023250/
我知道如何在 WPF 中设置默认的 ApplicationCommands 命令,以便通过上下文菜单启用简单的剪切、复制和粘贴操作。但是我需要能够在后面的代码中执行此操作,以便我可以在创建文本框时动态
我敢打赌这已经被多次回答了,但是...... 对于 UserControl 上的按钮将其命令属性设置为 Find (ApplicationCommands.Find) 之类的简单情况,ViewMode
WPF 文本框为自己的撤消/重做捕获 Ctrl-Z 和 Ctrl-Y。通常很好,但是在我们的应用程序中,我们有一些文本框,我不希望有这种行为,而是传递给整个应用程序以作为全局撤消处理。 我发现我可以通
我想标题中的问题已经很清楚了。当我打电话时会发生什么 ApplicationCommands.Close.Execute(null,null) 来 self 的 View 模型类。 我有一个显示用户控
我想使用 ApplicationCommands。剪切、复制、粘贴、保存...它们看起来很有趣,因为命令路由、键绑定(bind)以及某些控件使用它们的事实。我了解如何绑定(bind)到我的 VM 上的
我已经成功地使用了一些使用 MVVM-Light 的自定义命令,但我希望我的应用程序能够响应标准的 ApplicationCommands,不仅在窗口级别,而且在详细的项目级别。 我有一个 TreeV
我使用标准的剪切、复制和粘贴命令(它是 ApplicationCommands 类的一部分)。是否可以重新定义 CanExecute 方法? 这是我的代码: XAML:
我正在将 WPF 与 Prism 结合使用。我在 Module A 中有一个自定义 Canavs DrawingCanvas.cs,我已将 ApplicationCommands.Delete 设置为
我是一名优秀的程序员,十分优秀!