gpt4 book ai didi

c# - 在没有 app.xaml 声明的项目上使用 viewmodellocator

转载 作者:行者123 更新时间:2023-12-03 17:03:05 24 4
gpt4 key购买 nike

我正在开发 Revit 的插件,想使用 mvvm light。我的问题是该程序运行我的 dll 而我没有 app.xaml 来将 viewmodellocator 的单例声明为应用程序的资源,将其声明为资源的最佳方法是什么?

Revit 将我的代码作为在实现 IExternalCommand 接口(interface)的解决方案中单独类中声明的命令运行。我可以在调用主窗口之前从代码后面设置这个资源吗?或者我可以将它设置为我的 mainwindow.xaml 的资源吗?

已编辑

到目前为止,我们已经尝试了 belov 代码,但是第一次运行该命令时出现错误,但第二次使用该命令时没有错误。

来自命令类 CheckerCommand.cs 的示例代码

[Transaction(TransactionMode.Manual)]
public class CheckerCommand : IExternalCommand
{
#region IExternalCommand Members Implementation

public Result Execute(ExternalCommandData revit, ref string message, ElementSet elements)
{
new ViewModelLocator();
MainWindow window = new MainWindow(revit);

try
{
WindowInteropHelper helper = new WindowInteropHelper(window)
{
Owner = Autodesk.Windows.ComponentManager.ApplicationWindow
};

window.ShowDialog();

return Result.Succeeded;
}

catch (Autodesk.Revit.Exceptions.OperationCanceledException)
{
// Element selection cancelled.
return Result.Cancelled;
}
catch (Exception e)
{
message = e.ToString();

try
{
MessageBox.Show(message, "Fatal error");
window.Close();
}
catch
{
return Result.Failed;
}

return Result.Succeeded;
}
}

#endregion
}

这是 MainWindow.xaml 上的一些示例代码

<Window x:Class="QMChecker.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:views="clr-namespace:QMChecker.Views"
xmlns:vm="clr-namespace:QMChecker.ViewModel"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:mvvm="http://www.galasoft.ch/mvvmlight"
mc:Ignorable="d"
WindowStartupLocation="CenterScreen"
Title="QMChecker" Height="700" Width="1200">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/QMChecker;component/Resources/CombinedResources.xaml"/>
</ResourceDictionary.MergedDictionaries>
<vm:ViewModelLocator x:Key="Locator"/>
</ResourceDictionary>
</Window.Resources>
<Window.DataContext>
<Binding Path="Main" Source="{StaticResource Locator}"/>
</Window.DataContext>
</Window>

来自代码隐藏 MainWindow.xaml.cs 的示例代码

public partial class MainWindow : Window
{
public MainWindow(ExternalCommandData _revit)
{
try
{
InitializeComponent();
}
catch (Exception e)
{
throw e;
}

ServiceLocator.Current.GetInstance<MainViewModel>().Revit = _revit;
}
}

来自 ViewModelLocator.cs 的示例代码

public class ViewModelLocator
{
/// <summary>
/// Initializes a new instance of the ViewModelLocator class.
/// </summary>
///

public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<MainViewModel>();
SimpleIoc.Default.Register<SpatialContainmentViewModel>();
SimpleIoc.Default.Register<SpatialContainmentDemandViewModel>();
SimpleIoc.Default.Register<RunChecksViewModel>();
SimpleIoc.Default.Register<SpatialContainmentParameterSummaryViewModel>();
}

public MainViewModel Main { get { return ServiceLocator.Current.GetInstance<MainViewModel>(); } }
public SpatialContainmentViewModel SpatialContainment { get { return ServiceLocator.Current.GetInstance<SpatialContainmentViewModel>(); } }
public SpatialContainmentDemandViewModel SpatialContainmentDemand { get { return ServiceLocator.Current.GetInstance<SpatialContainmentDemandViewModel>(); } }
public RunChecksViewModel RunChecks { get { return ServiceLocator.Current.GetInstance<RunChecksViewModel>(); } }
public SpatialContainmentParameterSummaryViewModel SpatialContainmentParameterSummary { get { return ServiceLocator.Current.GetInstance<SpatialContainmentParameterSummaryViewModel>(); } }

public static void Cleanup()
{
SimpleIoc.Default.Unregister<MainViewModel>();
SimpleIoc.Default.Unregister<SpatialContainmentViewModel>();
SimpleIoc.Default.Unregister<SpatialContainmentDemandViewModel>();
SimpleIoc.Default.Unregister<RunChecksViewModel>();
SimpleIoc.Default.Unregister<SpatialContainmentParameterSummaryViewModel>();
}
}

而且我必须在每个 UserControl 上使用 ResourceDictionary

<UserControl.Resources>
<ResourceDictionary>
<vm:ViewModelLocator x:Key="Locator"/>
</ResourceDictionary>
</UserControl.Resources>

最佳答案

老问题,我知道,但经过一番搜索后,我没有在其他地方找到答案。我只是让这个部分工作,这就是我所拥有的:

MainWindow.xaml.cs

...
public MainWindow()
{
Resources.Add("Locator", new ViewModelLocator());

InitializeComponent();
}
...

MainWindow.xaml

<Window 
...

xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:local="clr-namespace:AppleCMS.ModelHarvesterAddin"
DataContext="{Binding Main, Source={StaticResource Locator}}">

<Window.Resources>
<ResourceDictionary>
<local:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
</ResourceDictionary>
</Window.Resources>
...

其余的是 MVVMLight 的标准。我认为关键部分是代码隐藏中的 Resources.Add("Locator", new ViewModelLocator());

这在运行插件时有效。不过,看起来 MVVMLight 的设计时数据还不能正常工作。我还没有添加多个 View ,但我怀疑我在每个 View 中都需要以上内容。

关于c# - 在没有 app.xaml 声明的项目上使用 viewmodellocator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44702790/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com