WPF,Prism/Unity - 绑定异常

WPF, Prism/Unity - Binding Anomaly

我正在开发这种类型的 C# 应用程序: WPF/Prism/Unity(MVVM、区域、模块化、Telerik RadDocking 控件的自定义 RegionAdapterBase(在 RadDocking 级别,而不是窗格组级别)和一个窗格工厂,用于映射哪个窗格组(左下右下)选项卡应该在哪里出现)。

问题:

除了 DocumentHost 之外,一切都很好。我可以让文档显示在那里,但它们最终都具有相同的标签标题。你能帮我理解为什么会这样吗?

更多背景信息:

对于 DocumentHost 中的所有文档,我有一个引用 view/viewmodel 的模块。该视图有一个文本框,用于通过数据网格查询文本框中查询返回的 table 数据。想想SQL Server Mgmt Studio,右击table然后选择select查看table.

中的数据

screenshot

当用户右键单击 table 时,我有一个命令绑定到 "Explorer" 窗格上的上下文菜单 "Select Data" 选项,并且该命令包含以下代码:

_container.Resolve<SqlAndDataGridModule>(new DependencyOverride<IConversionExplorerObject>(obj)).Initialize();

"obj" 怎么了?我正在尝试将我单击的 table 的名称传递给文档模块,以便我可以设置选项卡标题。同样,除了 "overwrite all tabs titles" 问题外,这仍然有效。所有标签都以我最近打开的标签为标题。

所以 SqlAndDataGridModule 有一个初始化,我在其中执行此操作:

public void Initialize()
{
    // Register view and view model types
    _container.RegisterType<SqlAndDataGrid>();
    _container.RegisterType<ISqlAndDataGridView_ViewModel, SqlAndDataGridView_ViewModel>();

    // Create a view model
    SqlAndDataGridView_ViewModel s = new SqlAndDataGridView_ViewModel(_repository, _eventAggregator, _manager);

    // Set the property TabTitle to table's name
    // This property is bound to RadDocumentPane's header
    s.TabTitle = ((ConversionExplorerObject)_explorerObject).Name;

    // Create view and inject the view model with the tab title
    SqlAndDataGrid sv = _container.Resolve<SqlAndDataGrid>(new DependencyOverride<ISqlAndDataGridView_ViewModel>(s));

    // Register the instance in the container
    _container.RegisterInstance(s.TabTitle, sv);

    // Register the view with the DockRegion
    _manager.RegisterViewWithRegion(RegionNames.DockRegion, () => _container.Resolve<SqlAndDataGrid>(s.TabTitle));
}

我已经确认我正在创建单独的视图和视图模型,我什至可以在调试器中看到不同的选项卡标题。但似乎在绑定到窗格的某个地方 header,出了点问题。

我认为这是一个有约束力的问题,而不是 Telerik 问题,这就是为什么我在这里而不是那里发帖。感谢您提供任何帮助,如果有帮助,我很乐意提供更多信息。谢谢,克里斯

我解决了我的问题。如果这对任何人有帮助,我的问题是在我的 SqlAndDataGridModule 视图模型中我订阅了 "select all rows" 事件。这意味着视图模型的每个实例(每个选项卡一个)都订阅了该事件,并且每个视图模型都绑定到新选择的资源管理器对象。

我应该只从 shell 的视图模型订阅,因为这是我实例化 SqlAndDataGridModule(及其 view/viewmodel)的新实例的地方。故事的寓意 - 注意发布了哪些事件以及您如何订阅它们。