Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 已将命令注册到commandmanager,但未启动_C#_Mvvm_Catel - Fatal编程技术网

C# 已将命令注册到commandmanager,但未启动

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

我有一个视图,其中有一个tabcontrol。 每个选项卡都是不同的viewmodel。选项卡上方是一个保存按钮,用于保存活动选项卡

我尝试使用CommandManager将按钮的点击传递给viewmodel,但它不会点击

这是我的设置

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内设置绑定到此命令的操作或命令

以下是应用程序范围内命令的几个示例:

一些旁注:

  • 我注意到您正在手动解析ICommandManager,但我建议也使用依赖项注入来注入ICommandManager
  • 我看到您对Catel属性使用了“长符号”。我建议您研究Catel.Fody,以便简化您的属性定义和总体Catel开发

  • 我将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);