N36600修改

This commit is contained in:
hsc
2026-07-15 17:21:18 +08:00
parent 8e44be4894
commit 0ed080f63c
5 changed files with 42 additions and 37 deletions

View File

@@ -127,26 +127,37 @@ namespace TestingModule.ViewModels
if (SelectedDevice == null) return;
var type = SelectedDevice.DeviceType.Split('.').Last();
var viewName = type + "View";
var vmName = type + "ViewModel"; // 按照命名规范拼接出对应的 VM 类型名
try
{
// 1. 先确保弹窗管理器窗口已打开(首次 Show后续只追加 Tab
// 1. 先确保弹窗管理器窗口已打开
if (_dialogWindow == null || !_dialogWindow.IsVisible)
{
_dialogService.Show("DialogMangerView");
// 找到刚刚被 DialogService 打开的窗口(按 DataContext 类型名匹配)
_dialogWindow = System.Windows.Application.Current.Windows
.OfType<System.Windows.Window>()
.FirstOrDefault(w => w.DataContext?.GetType().Name == "DialogMangerViewModel");
}
// 2. 从容器按注册名解析设备编辑 View
// 2. 从当前专属容器解析设备编辑 View 实例
var view = _containerProvider.Resolve<object>(viewName) as System.Windows.FrameworkElement;
if (view == null) return;
// 3. 通过反射调用 ViewModel 上的 Initialize(deviceName) 方法,
// 避免 TestingModule 直接引用 DeviceEditModule 的类型
// 3. 关键:从同一个台架的专属容器中解析出该设备对应的 ViewModel 实例
// 从而实现:不同的台架(不同的专属 _containerProvider解析出各自独立的 VM 实例
var vmType = Assembly.Load("DeviceEditModule").GetType($"DeviceEditModule.ViewModels.{vmName}");
if (vmType != null)
{
var scopedViewModel = _containerProvider.Resolve(vmType);
if (scopedViewModel != null)
{
// 手动绑定 DataContext将其锁死在当前作用域内
view.DataContext = scopedViewModel;
}
}
// 4. 调用 ViewModel 上的 Initialize 方法
var vm = view.DataContext;
if (vm != null)
{
@@ -154,18 +165,16 @@ namespace TestingModule.ViewModels
initMethod?.Invoke(vm, new object[] { SelectedDevice.DeviceName });
}
// 4. 发布事件 → DialogMangerViewModel 接收后将此 View 添加为 Tab
// 标题格式:{当前作用域} - {设备名称}
// 去重依据:设备硬件指纹(同一物理设备不重复打开)
// 5. 发布事件,将绑定好独立 VM 的 View 实例作为 Tab 载入
var fingerprint = DeviceManager.ExtractHardwareFingerprint(SelectedDevice);
_eventAggregator.GetEvent<AddDialogTabEvent>().Publish(new DialogTabInfo
{
Title = $"{_globalInfo.CurrentScope} - {SelectedDevice.DeviceName}",
Title = $"{_globalInfo.CurrentScope} - {SelectedDevice.DeviceName}",
Fingerprint = fingerprint,
Content = view
Content = view
});
// 5. 窗口置顶(确保用户看到新增的 Tab
// 6. 窗口置顶
if (_dialogWindow != null && _dialogWindow.IsVisible)
{
if (_dialogWindow.WindowState == System.Windows.WindowState.Minimized)