我使用 Prism6 + Unity 容器进行桌面应用程序开发。这是一篇长篇大论,抱歉。所以我在顶部问:如果输入值为 Unity 单例,Prism SetProperty() 函数不会上升属性更改事件。我明白为什么:因为输入值和保存值对单例实例具有相同的引用。RaisePropertyChanged() 在这种情况下没有帮助。长读是statring...
所以,我的 UserControl 组件中有一个依赖属性:
public static readonly DependencyProperty WorksheetDataProperty =
DependencyProperty.Register("WorksheetData", typeof(WorksheetDataModel), typeof(SheetUserControl),
new PropertyMetadata(new WorksheetDataModel(), WorksheetDataPropertyChanged));
public WorksheetDataModel WorksheetData {
get { return (WorksheetDataModel)GetValue(WorksheetDataProperty); }
set { SetValue(WorksheetDataProperty, value); }
}
private void WorksheetDataPropertyChanged(WorksheetDataModel worksheetData) {
if (worksheetData == null)
return;
SheetGrid.Model.ActiveGridView.BeginInit();
this.ClearWorksheetModel();
this.ResizeWorksheetModel();
SheetGrid.Model.ActiveGridView.EndInit();
}
private static void WorksheetDataPropertyChanged(
DependencyObject d, DependencyPropertyChangedEventArgs e) {
((SheetUserControl)d).WorksheetDataPropertyChanged((WorksheetDataModel)e.NewValue);
}
从 WorksheetDataPropertyChanged() 函数调用操作对我来说很重要。没有共享服务(单例)的方案运行良好:调用此函数。
但现在我想在几个模块之间共享数据。我如何看待它:我有一些“父”模块,它从存储中加载\保存数据并与其他几个模块共享这些数据,这些模块可以修改共享数据,但不能保存它。而且 EventAggregator 对我来说并不方便:我不想创建数据副本,然后在修改后再次收集它。所以我将我的“共享服务”注册为单例:
_container.RegisterInstance(new WorksheetDataModel());
现在我可以将“父”视图模型中的数据库中的数据加载到上一步创建的单例对象中:
var data = _container.Resolve<WorksheetDataModel>();
data.Header = args.Header;
data.User = args.User;
data.RowHeader = new WorksheetRowHeader(_model.ReadRowHeader(data.Header.WshCode));
data.ColHeader = new WorksheetColHeader(_model.ReadColHeader(data.Header.WshCode));
data.Cells = _model.ReadCells(data.Header.WshCode);
此外,我通知子视图模型有关单例中的新数据:
data.OnDataChanged?.Invoke();
现在最重要的代码来自子视图模型。在委托处理程序中,我“应用”新值:
WorksheetData = _container.Resolve<WorksheetDataModel>();
工作表数据是:
private WorksheetDataModel _worksheetData;
public WorksheetDataModel WorksheetData {
get { return _worksheetData; }
set { SetProperty(ref _worksheetData, value); }
}
这一行的问题:
set { SetProperty(ref _worksheetData, value); }
它在第一次调用时只工作一次,因为 _worksheetData 为空。但是随后 _worksheetData (指针)的引用设置为单例,并且在所有下一个调用值和 _worksheetData 对于 SetProperty() 都是相同的,因此它就退出了。
我尝试了下一个代码:
set {
SetProperty(ref _worksheetData, value);
RaisePropertyChanged("WorksheetData")
}
但是没有效果。UserControl 组件中的 WorksheetDataPropertyChanged() 回调未调用。
所以,我现在不知道如何更好地在几个模块之间共享一些数据。感谢您的任何建议。