C# 已将命令注册到commandmanager,但未启动
我有一个视图,其中有一个tabcontrol。 每个选项卡都是不同的viewmodel。选项卡上方是一个保存按钮,用于保存活动选项卡 我尝试使用CommandManager将按钮的点击传递给viewmodel,但它不会点击 这是我的设置C# 已将命令注册到commandmanager,但未启动,c#,mvvm,catel,C#,Mvvm,Catel,我有一个视图,其中有一个tabcontrol。 每个选项卡都是不同的viewmodel。选项卡上方是一个保存按钮,用于保存活动选项卡 我尝试使用CommandManager将按钮的点击传递给viewmodel,但它不会点击 这是我的设置 using Catel.MVVM; using Catel.Windows; namespace Views public partial class MainWindow : DataWindow { private readonly CommandManag
using Catel.MVVM;
using Catel.Windows;
namespace Views
public partial class MainWindow : DataWindow
{
private readonly CommandManagerWrapper _commandManagerWrapper;
public MainWindow()
: base(DataWindowMode.Custom, null, DataWindowDefaultButton.None, true, InfoBarMessageControlGenerationMode.None)
{
InitializeComponent();
_commandManagerWrapper = new CommandManagerWrapper(this);
}
}
此主窗口调用一个视图
<catel:DataWindow x:Class="Views.CustomerOrderBlocksWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:catel="http://catel.codeplex.com"
xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:b="clr-namespace:TrendzzForYou.Helpers"
xmlns:controls="clr-namespace:Views"
xmlns:helpers="clr-namespace:Helpers"
xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
ResizeMode="CanResize" SizeToContent="WidthAndHeight"
WindowStartupLocation="CenterScreen" WindowState="Normal"
Icon="/Resources/Graphics/Filters64.png"
MinHeight="1000" MinWidth="1800">
<catel:DataWindow.Resources>
<DataTemplate x:Key="TotalOrderTemplate">
<controls:CustomerOrderTotalControl DataContext="{Binding CurrentTabContentViewModel}"/>
</DataTemplate>
<DataTemplate x:Key="NonDeliverableItemsTemplate">
<controls:CustomerOrderNonDeliverableControl DataContext="{Binding CurrentTabContentViewModel}"/>
</DataTemplate>
<helpers:CustomerOrderBlocksTemplateSelector x:Key="selector"
TotalOrderTemplate="{StaticResource TotalOrderTemplate}"
NonDeliverableItemsTemplate="{StaticResource NonDeliverableItemsTemplate}"/>
</catel:DataWindow.Resources>
<Grid Margin="0,0,10,0">
<Grid.RowDefinitions>
<RowDefinition Height="170"/>
<RowDefinition MinHeight="750"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition MinWidth="1800"/>
</Grid.ColumnDefinitions>
<StackPanel>
<telerik:RadButton Command="{catel:CommandManagerBinding Accept}" ToolTip="Sla gegevens op en voer volgende order in" TabIndex="99" Grid.Row="0">
<StackPanel Orientation="Horizontal">
<Image Source="/Resources/Graphics/Accept16.png" Height="16" />
<telerik:Label Content="Opslaan" />
</StackPanel>
</telerik:RadButton>
</StackPanel>
<telerik:RadTabControl Grid.Row="1" Grid.Column="0"
DisplayMemberPath="Header"
ContentTemplateSelector="{StaticResource selector}"
ItemsSource="{Binding Tabs}"
SelectedIndex="{Binding CustomerOrderTab}"/>
}
最后是TabItemModel:
using Catel.MVVM;
namespace Models
{
public class TabItemModel
{
/// <summary>
/// Tab Header text
/// </summary>
public string Header { get; set; }
/// <summary>
/// Tab content
/// </summary>
public IViewModel CurrentTabContentViewModel { get; set; }
}
}
使用Catel.MVVM;
名称空间模型
{
公共类tabitem模型
{
///
///选项卡标题文本
///
公共字符串头{get;set;}
///
///选项卡内容
///
公共IViewModel CurrentTabContentViewModel{get;set;}
}
}
根据文档,我希望单击时在CustomerOrderTotalControlViewModel中触发CmdAccept,但它没有
我错过了什么或做错了什么
Jeroen有点难说,但是你检查过Catel日志了吗?可能的情况是在视图模型中创建的命令。此时,视图可能已经加载,CommandManagerBinding已经完成了它的一部分 为了解决这个问题,建议在应用程序启动时注册所有命令(或者在插件/扩展的情况下,在插件初始化时注册)。然后,可以在视图模型的ctor内设置绑定到此命令的操作或命令 以下是应用程序范围内命令的几个示例: 一些旁注:
我将CommandManagerRapper从MainWindow.xaml.cs移动到CustomerOrderBlocks.xaml.cs 和在CustomerOrderTotalControlViewModel中 将注册表命令更改为
commandManager.RegisterCommand("Accept", CmdAccept);
它是有效的
不知道为什么在代码的最后一部分删除“this”会产生不同这个“this”将vm注入到命令的生命周期中。一旦虚拟机卸载,Catel将自动从“系统范围命令”中删除该命令,以防止内存泄漏。如果您没有指定它,您需要自己注销它。如果您想自己管理命令的生命周期,我建议使用InitializeAsync和CloseAsync。
using Catel.MVVM;
namespace Models
{
public class TabItemModel
{
/// <summary>
/// Tab Header text
/// </summary>
public string Header { get; set; }
/// <summary>
/// Tab content
/// </summary>
public IViewModel CurrentTabContentViewModel { get; set; }
}
}
commandManager.RegisterCommand("Accept", CmdAccept);