如何在 Metro 中将 Windows 命令与 Caliburn.Micro 绑定?

How to bind WindowsCommands with Caliburn.Micro in Metro?

我刚刚将 MahApps.Metro WPF UI 包添加到我使用 Caliburn.Micro 的现有 WPF 应用程序中。在我的MainView我有一个带按钮的菜单,可以切换UI主区域的内容,如下:

<DockPanel>
     <Button DockPanel.Dock="Left" Style="{StaticResource MenuButton}" Name="ShowHomeVM">
</DockPanel>

并且在 MainViewModel 中,我有以下受命名约定约束的方法,

public void ShowHomeVM() {
    CentralVM = HomeVM;
}

并且 CentralVM 视图模型实例绑定到 window 的内容。 现在,对于 Metro,我想将我的菜单移动到 windows 标题栏,如下所示

<Controls:MetroWindow.LeftWindowCommands>
    <Controls:WindowCommands>
        <Button Name="ShowHomeVM" Content="Home"/>
    </Controls:WindowCommands>
</Controls:MetroWindow.LeftWindowCommands>

这行得通,除了 Caliburn 不再将按钮绑定到视图模型中的方法。

如何使用 caliburn.micro 将方法绑定到标题栏中的按钮?

Caliburn.Micro 无法处理这些情况。您唯一的选择是:

  1. 分叉 Caliburn.Micro 源并自行修复。
  2. 放弃 Caliburn.Micro 并使用不同的 MVVM 框架。

这确实不符合 Caliburn.Micro 的内置功能。我没有更改@Keith 建议的框架内部结构,而是手动连接按钮,即在我的 MainView 中,我按如下方式定义按钮,

<Controls:MetroWindow.LeftWindowCommands>
    <Controls:WindowCommands>
        <Button Content="Home" Command="{Binding HomeCommand}"/>
        <Button Content="Import" Command="{Binding ImportCommand}"/>
        <Button Content="Players" Command="{Binding PlayerCommand}"/>
    </Controls:WindowCommands>
</Controls:MetroWindow.LeftWindowCommands>

在这里,我将 Command 属性 绑定到 MainViewModel 中的命令,如下所示,

public class MainViewModel : PropertyChangedBase {

    // ... other stuff ... 

    public ICommand HomeCommand { get; private set; }
    public ICommand PlayerCommand { get; private set; }
    public ICommand ImportCommand { get; private set; }

    public MainViewModel(IEventAggregator eventAggregator) {

        // ... other stuff ... //

        HomeCommand = new RelayCommand(o => CentralVM = HomeVM, o => true);
        PlayerCommand = new RelayCommand(o => CentralVM = PlayersVM, o => true);
        ImportCommand = new RelayCommand(o => CentralVM = ImportVM, o => true);
    }
}

至于RelayCommand class,我正在使用给定的实现here。构造函数中的第一个参数是命令应该执行的操作,第二个参数是它是否应该能够执行它——我希望菜单按钮始终如此(现在)。

我发现 Caliburn.Micro 仍然有帮助,可能不如按名称绑定那么舒服,但您可以使用 caliburnproject 命名空间中的 Message.Attach。

我是这样做的:

xmlns:cal="http://www.caliburnproject.org"

<Controls:MetroWindow.LeftWindowCommands>
    <Controls:WindowCommands>
        <Button Content="Home" cal:Message.Attach="[Event Click] = [Action ShowHomeVM()]"/>
    </Controls:WindowCommands>
</Controls:MetroWindow.LeftWindowCommands>

希望对您有所帮助。