我有几个外部命令,当通过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窗口是否阻止正在发送的命令?