C# 级联命令绑定是可能的
我有一个主窗口,其中包含使用MVVM的多个视图。事实上,主窗口只保存一个模型列表,每次添加模型时,它都会在此处创建一个视图,即UserControl,并将DataContext模型与视图关联。每个视图都放在TabControl中单独的TabItem中 模型本身有一个CommandBindingsCollection,并将此命令绑定分配给视图。这意味着,例如,F10可以多次使用,但只有活动视图才能对F10作出反应 但是,F10根本不起作用。只有当我将CommandBinding分配给MainWindow时,它才会工作,但这会使视图依赖于UserControl,而这不是我想要的,因为我希望创建的视图尽可能独立于MainWindow 我唯一的解决方案是动态拦截当前TabItem的更改,并为活动视图添加/删除命令。目前,一切都可以在没有代码的情况下工作,但我必须为它编写代码 附件是主窗口的代码:C# 级联命令绑定是可能的,c#,wpf,mvvm,C#,Wpf,Mvvm,我有一个主窗口,其中包含使用MVVM的多个视图。事实上,主窗口只保存一个模型列表,每次添加模型时,它都会在此处创建一个视图,即UserControl,并将DataContext模型与视图关联。每个视图都放在TabControl中单独的TabItem中 模型本身有一个CommandBindingsCollection,并将此命令绑定分配给视图。这意味着,例如,F10可以多次使用,但只有活动视图才能对F10作出反应 但是,F10根本不起作用。只有当我将CommandBinding分配给MainWin
<Window x:Class="WpfApplication3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication3"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
</Window>
using System.Windows;
namespace WpfApplication3
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
PluginControl aControl = new PluginControl();
Content = aControl;
}
}
}
以及UserControl的代码:
<UserControl x:Class="WpfApplication3.PluginControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfApplication3"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300" Background="White">
<StackPanel>
<Button Command="{Binding myCommand}" Content="PushMe" Focusable="False"/>
<Label Content="Nothing pressed" Name="myLabel"/>
</StackPanel>
</UserControl>
using System;
using System.Windows.Controls;
using System.Windows.Input;
namespace WpfApplication3
{
/// <summary>
/// Interaction logic for PluginControl.xaml
/// </summary>
public partial class PluginControl : UserControl
{
public RoutedCommand myCommand
{
get;
private set;
}
public PluginControl()
{
InitializeComponent();
DataContext = this;
myCommand = new RoutedCommand();
myCommand.InputGestures.Add(new KeyGesture(Key.F10));
CommandBindings.Add(new CommandBinding(myCommand, myCommandHandler));
}
private void myCommandHandler(object sender, ExecutedRoutedEventArgs executed)
{
myLabel.Content = DateTime.Now.ToString();
}
}
}
正如您所看到的,我已经将按钮设置为focusablefalse,因为我希望命令在一般情况下工作,而不仅仅是在按钮被聚焦时。我遗漏了一些东西或思考了一个错误的方向,添加CommandBinding并不意味着命令在没有绑定的情况下可以工作
将命令添加到主窗口本身可以工作
有什么帮助吗?你能用一点代码说明一下情况吗?抱歉,如果我听起来很困惑。不确定我是否理解,但您不想知道如何以MVVM方式将F10按键传播到viewmodel吗?我添加了一个示例。问题在于,向某些子控件添加命令绑定显然不会作为隧道事件从主窗口传播到子控件。