如何在 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 无法处理这些情况。您唯一的选择是:
- 分叉 Caliburn.Micro 源并自行修复。
- 放弃 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>
希望对您有所帮助。
我刚刚将 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 无法处理这些情况。您唯一的选择是:
- 分叉 Caliburn.Micro 源并自行修复。
- 放弃 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>
希望对您有所帮助。