Prism6共享服务和依赖性属性



我使用Prism6 Unity容器来开发桌面应用程序。这是一段漫长的,很抱歉。因此,我在顶部问:如果输入值是Unity Singleton,则Prism setProperty()函数不会更改属性。我理解原因:因为输入值和保存值对Singleton实例的引用相同。在这种情况下,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()函数中调用动作很重要。没有共享服务的方案(Singleton)运行良好:此功能称为。

,但现在我想在几个模块之间共享数据。我如何看待它:我有一些"父"模块,这些模块从存储中加载保存数据,并与其他几个模块共享数据,这些模块可以修改共享数据,但无法保存。而EventAggregator对我来说并不方便:我不想创建数据副本,然后在修改后再次收集。因此,我将我的"共享服务"注册为Singleton:

_container.RegisterInstance(new WorksheetDataModel());

现在,我可以从"父" ViewModel中的数据库中加载数据到上一步中创建的Singleton对象:

    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);

此外,我在Singleton中通知有关新数据的儿童ViewModels:

    data.OnDataChanged?.Invoke();

现在来自Child ViewModel的最重要代码。在代表处理程序中我"应用"新值:

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为null。但是,_worksheetdata(指针)设置为Singleton的引用,在所有下一个呼叫值和_workSheetData中对于SetProperty()是相同的,因此,它只是退出。

我尝试了下一个代码:

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

但没有效果。USERCONTROL组件中的WorksheetDataPropertyChanged()回调。

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

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 ) );
}

相关内容

  • 没有找到相关文章

最新更新