我有几个外部命令,当通过Revit中的下拉按钮调用时,它们可以完美地工作.我试图通过使用MVVM模式在WPF窗口中创建一个命令列表来升级代码.在这些情况下,没有模型,而是与Revit文件对话的服务.下面是一个执行调用以移除material 的服务的示例:

using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;

namespace DevTools.Services.Cleaner
{
    [Transaction(TransactionMode.Manual)]
    [Regeneration(RegenerationOption.Manual)]
    [Journaling(JournalingMode.NoCommandData)]
    public class PurgeAllMaterialsService : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            var uiDoc = commandData.Application.ActiveUIDocument;
            var doc = uiDoc.Document;
        try
        {
            using Transaction trans = new(doc, "Delete all materials");

            var allMaterials = new FilteredElementCollector(doc)
                .OfClass(typeof(Material))
                .ToElementIds();

            var count = 0;

            trans.Start();
            foreach (var id in allMaterials)
            {
                try
                {
                    var m = doc.GetElement(id) as Material;
                    {
                        uiDoc.Document.Delete(id);
                        count++;
                    }
                }
                catch (Exception ex)
                {
                    message = ex.Message;
                    return Result.Failed;
                }
            }
            trans.Commit();
            TaskDialog.Show("Delete All Materials", count + " materials have been deleted");
            return Result.Succeeded;
        }
        catch (Autodesk.Revit.Exceptions.OperationCanceledException)
        {
            return Result.Cancelled;
        }
        catch (Exception ex)
        {
            message = ex.Message;
            return Result.Failed;
        }
    }
}
}

视图模型将服务传递给命令

using DevTools.Services.Cleaner;

namespace DevTechTools.ViewModels
{
    public class CleanerViewModel
    {
        public PurgeAllMaterialsService PurgeMaterialCommand { get; }
        public CleanerViewModel(PurgeAllMaterialsService purgeAllMaterials)
        {
            PurgeMaterialCommand = new PurgeAllMaterialsService();
        }
    }
}

并且该命令将服务传递给该视图.

using System.Windows.Input;
using CommunityToolkit.Mvvm.Input;
using DevTechTools.Services.Cleaner;

namespace DevTools.ViewModels
{
    public partial class CleanerViewModel
    {
        public ICommand PurgeMaterialCommand { get; }
        public CleanerViewModel(PurgeAllMaterialsService purgeAllMaterials)
        {
            PurgeMaterialCommand = new RelayCommand(WipeMaterials);
        }

        [RelayCommand]
        private void WipeMaterials()
        {
            var purgeAllMaterials = new PurgeAllMaterialsService();
        }
    }
}

在该视图中,该命令由如下所示的按钮调用.

<Button Content="Purge Materials"
        Command="{Binding PurgeMaterialCommand, Mode=OneWay}"
        Width="200"
        Height="28"
        Margin="0,10,0,0"
        BorderBrush="Transparent"
        Background="{StaticResource HeaderBackgroundBrush}"
        Foreground="{StaticResource LightBrush}" />

问题是该按钮不执行该命令.遗漏了什么?WPF窗口是否阻止正在发送的命令?

推荐答案

ButtonCommand属性必须设置或绑定到实现System.Windows.Input.ICommand接口的对象.

因此,您的视图模型的PurgeMaterialCommand属性应该返回ICommand实现.然后,当您通过单击该按钮调用该命令时,将调用Execute(object parameter)方法.

Csharp相关问答推荐

发布.NET框架项目将.NET核心元素注入到web. connect中

C#使用属性和值将JSON转换为XML

如何使用while循环实现异常处理

如何使用XmlSerializer反序列化字符串数组?

dotnet集合中内部数组的局部变量副本的用途是什么?'

ASP.NET Core 8.0 JWT验证问题:尽管令牌有效,但SecurityTokenNoExpirationError异常

ITypeLib2.GetLibStatistics()在C#中总是抛出AccessViolationException

使用两个不同的枚举作为Switch语句中的CASE生成唯一值

SortedSet.Remove()不会删除SortedSet.Min返回的元素

如何在毛伊岛应用程序中完美地同步视图模型和视图的加载?

EF核心区分大小写的主键

升级后发出SWITCH语句

用C#从XML内部元素中获取特定值

Postgres ENUM类型在第一次运行时对Dapper不可见

如何正确处置所有动态控件?

将C#类导入到PowerShell

SqlException:无法打开数据库.升级到Dotnet 8后-数据库兼容性版本-非EFCore兼容性级别

如果所有";async任务方法()";调用都返回Task.FromResult()-是否同步执行?

C#中的逻辑运算符用作单词';is';and';and';

为什么INTEGER在通过反射调用时对空对象返回TRUE,而在INTEGER上调用时返回FALSE?