Hello!
I need a way to initialize FlatDataSource from code. I use MVVM pattern and currently FlatDataSource in my ViewModel is populated with initial items and initialized only after view have been initialized. Now if I want to do something with initialized datasource, I do this in ResultChanged event handler. But this breaks View-ViewModel separation and I can't properly test my code.
Maybe I'm missing something? How can I initialize FlatDataSource with items from ItemsSource without loading the PivotGrid?
Here is my code to generate FlatDataSource:
DataSource = new FlatDataSource { ItemsSource = Items, Cube = DataSourceBase.GenerateInitialCube("DistributorInventory"), Rows = DataSourceBase.GenerateInitialItems("[Distributor].[Distributor]"), Columns = DataSourceBase.GenerateInitialItems("[Date].[Date]"), Measures = DataSourceBase.GenerateInitialItems("Value") };
var cubeMetadata = new CubeMetadata { DisplayName = "Cube", DataTypeFullName = typeof(DistributorInventory).FullName }; cubeMetadata.DimensionSettings.Add(new DimensionMetadata { SourcePropertyName = "Value", DisplayName = "Value", });DataSource.CubesSettings.Add(cubeMetadata);
var datesHierarchy = new HierarchyDescriptor(p => p.Date) {HierarchyDisplayName = "Date"}; datesHierarchy.AddLevel(p => p.MonthText, "Month"); datesHierarchy.AddLevel(p => p.WeekText, "Week"); DataSource.AddHierarchyDescriptor(datesHierarchy);
var itemsHierarchy = new HierarchyDescriptor(p => p.Distributor) {HierarchyDisplayName = "Distributor"}; itemsHierarchy.AddLevel(p => p.Distributor, "Distributor"); itemsHierarchy.AddLevel(p => p.Address, "Address"); itemsHierarchy.AddLevel(p => p.Item, "Item");DataSource.AddHierarchyDescriptor(itemsHierarchy);
DataSource.ResultChanged += OnDataSourceOnResultChanged;
Hello,
In order to initialize the data source in code behind you have to call IOlapViewModel.LoadSchemaAsync method. This call will initialize the data source's metadata tree - the cube and its dimensions, hierarchies, levels and measures. Once the metadata is loaded IOlapViewModel.Initialized event is fired and then the initial Rows, Columns, Filters and Measures are set.
Regards,Plamen
Hello Maria!
Yes, I need to have rows and cells created without XamPivotGrid control (in code-behind). I need this because we implement MVVM pattern (which is quite common for WPF), and one of it's main paradigms is that ViewModel should never know of View. And concerning that FlatDataSource is implementing IOlapViewModel interface I found very strange that FlatDataSource might depend on View (which is XamPivotGrid control).
In case if it's not possible (althought I very much hope that it is), how can I use XamPivotGrid (which is in View) with data from my ViewModel? FlatDataSource's ItemsSource property is not DependencyProperty, so I can't bind it to my items collection in my ViewModel.
Hello and thank you for posting!
I have been looking into your description and I am not completely sure what you are trying to achieve. The rows and cells are actually created when the control where they are displayed is loaded. Would you like to be able to modify them before loading the data in XamPivotGrid? Could you give me more details of the goal you are trying to achieve so I could try to provide you a better solution?