Prism6共享服务和依赖项属性

时间:2019-03-05 17:30:42

标签: unity-container prism prism-6 sharedservices

我使用Prism6 + Unity容器进行桌面应用程序开发。 这是一本长篇小说,对不起。所以我首先问:如果输入值为Unity单例,则Prism SetProperty()函数不会发生属性更改事件。我理解为什么:因为输入值和保存值对单例实例具有相同的引用。 RaisePropertyChanged()在这种情况下无济于事。 长时间阅读正说明...

因此,我的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>();

WorksheetData是:

    private WorksheetDataModel _worksheetData;
    public WorksheetDataModel WorksheetData {
        get { return _worksheetData; }
        set { SetProperty(ref _worksheetData, value); }
    }

此行中的问题:

set { SetProperty(ref _worksheetData, value); }

因为_worksheetData为空,所以它在第一次调用时仅工作一次。但是然后,将_worksheetData(指针)的引用设置为单例,并且在所有下一个调用值中,_Property()的引用值和_worksheetData都相同,结果,它退出了。

我尝试了下一个代码:

set { 
    SetProperty(ref _worksheetData, value); 
    RaisePropertyChanged("WorksheetData")
}

但是没有效果。 UserControl组件中的WorksheetDataPropertyChanged()回调未调用。

所以,我现在不知道如何在几个模块之间更好地共享一些数据。 感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

WorksheetData不变,WorksheetDataModel实例的内容也变化。

因此要更新您的绑定,

  • WorksheetDataModel实现INotifyPropertyChanged和/或使用INotifyCollectionChanged实现集合
  • 或者您让视图模型侦听WorksheetDataModel.OnDataChanged并提出自己的PropertyChanged以将所有绑定更新为WorksheetData

示例:

private WorksheetDataModel _worksheetData;
public WorksheetDataModel WorksheetData
{
    get { return _worksheetData; }
    set
    {
        if (_worksheetData != null)
            _worksheetData.OnDataChanged -= DataChangedHandler;
        SetProperty(ref _worksheetData, value);
        if (_worksheetData != null)
            _worksheetData.OnDataChanged += DataChangedHandler;
    }
}

private void DataChangedHandler( object sender, DataChangedEventArgs args )
{
    RaisePropertyChanged( nameof( WorksheetData ) );
}