using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using Telerik.Windows.Controls;using Telerik.Windows.Persistence.Services;namespace BasicDockingPersistenceExample{ public class DockingCustomPropertyProvider : ICustomPropertyProvider { public CustomPropertyInfo[] GetCustomProperties() { // Create two custom properties to serialize the Layout of the RadDocking and the Content of the RadPanes return new CustomPropertyInfo[] { new CustomPropertyInfo("Layout", typeof (string)), new CustomPropertyInfo("Content", typeof (List<PaneProxy>)) {AllowCreateInstance = false, TreatAsUI = false}, }; } public void InitializeObject(object context) { } public object InitializeValue(CustomPropertyInfo customPropertyInfo, object context) { if (customPropertyInfo.Name == "Content") { // See remarks in ProvideValue method: // provide the values on which the saved properties will be restored upon RadDocking docking = context as RadDocking; List<PaneProxy> proxies = new List<PaneProxy>(); foreach (RadPane pane in this.GetOrderedPanes(docking).ToArray()) { proxies.Add(new PaneProxy() { Content = pane.Content }); } return proxies; } return null; } public object ProvideValue(CustomPropertyInfo customPropertyInfo, object context) { RadDocking docking = context as RadDocking; if (customPropertyInfo.Name == "Layout") { // let the RadDocking save the layout of the Panes: return this.SaveLayoutAsString(docking); } else if (customPropertyInfo.Name == "Content") { // create proxies for all of the Panes and save their content IEnumerable<RadPane> panes = this.GetOrderedPanes(docking); List<PaneProxy> proxies = new List<PaneProxy>(); foreach (RadPane pane in panes) { proxies.Add(new PaneProxy() { Content = pane.Content }); } return proxies; } return null; } public void RestoreValue(CustomPropertyInfo customPropertyInfo, object context, object value) { if (customPropertyInfo.Name == "Layout") { // let the RadDocking load the layout of the RadPanes this.LoadLayoutFromString(value.ToString(), context as RadDocking); } else if (customPropertyInfo.Name == "Content") { // the PersistenceManager does not re-create UI elements - in this case the Content of the RadPane. // So, instead of providing a value on which the saved properties will be applied, // we will use the InitializeValue method. } } private string SaveLayoutAsString(RadDocking instance) { MemoryStream stream = new MemoryStream(); instance.SaveLayout(stream); stream.Seek(0, SeekOrigin.Begin); StreamReader reader = new StreamReader(stream); return reader.ReadToEnd(); } private void LoadLayoutFromString(string xml, RadDocking instance) { using (Stream stream = new MemoryStream(Encoding.UTF8.GetBytes(xml))) { stream.Seek(0, SeekOrigin.Begin); instance.LoadLayout(stream); } } private IEnumerable<RadPane> GetOrderedPanes(RadDocking docking) { // get the RadPanes always in the same order: RadPane[] array = docking.Panes.ToArray(); Array.Sort(array, new RadPaneComparer()); return array; } } public class RadPaneComparer : IComparer<RadPane> { int IComparer<RadPane>.Compare(RadPane x, RadPane y) { // compare RadPanes by their serialization tag: string xSerializationTag = RadDocking.GetSerializationTag(x); string ySerializationTag = RadDocking.GetSerializationTag(y); return xSerializationTag.CompareTo(ySerializationTag); } } public class PaneProxy { public object Content { get; set; } }}using System;using System.Collections.Generic;using System.ComponentModel;using System.Linq;using System.Text;namespace BasicDockingPersistenceExample{ public class MainWindowViewModel : INotifyPropertyChanged { public MainWindowViewModel() { } #region DockPanel pinning properties private bool? _pane2PanelIsPinned = false; public bool? Pane2PanelIsPinned { get { return _pane2PanelIsPinned; } set { _pane2PanelIsPinned = value; FirePropertyChanged("Pane2PanelIsPinned"); } } private bool? _pane1PanelIsPinned = false; public bool? Pane1PanelIsPinned { get { return _pane1PanelIsPinned; } set { _pane1PanelIsPinned = value; FirePropertyChanged("Pane1PanelIsPinned"); } } private bool? _pane5PanelIsPinned = false; public bool? Pane5PanelIsPinned { get { return _pane5PanelIsPinned; } set { _pane5PanelIsPinned = value; FirePropertyChanged("Pane5PanelIsPinned"); } } private bool? _pane3PanelIsPinned = true; public bool? Pane3PanelIsPinned { get { return _pane3PanelIsPinned; } set { _pane3PanelIsPinned = value; FirePropertyChanged("Pane3PanelIsPinned"); } } private bool? _pane4PanelIsPinned = true; public bool? Pane4PanelIsPinned { get { return _pane4PanelIsPinned; } set { _pane4PanelIsPinned = value; FirePropertyChanged("Pane4PanelIsPinned"); } } #endregion public event PropertyChangedEventHandler PropertyChanged; protected void FirePropertyChanged(string property) { //Should only be called by ViewModel base class. Derived classes should use lambda/LINQ syntax to simplify refactoring if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(property)); } }}using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes;using Telerik.Windows.Controls;using Telerik.Windows.Persistence.Services;using Telerik.Windows.Persistence.Storage;namespace BasicDockingPersistenceExample{ /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { ServiceProvider.RegisterPersistenceProvider<ICustomPropertyProvider>(typeof(RadDocking), new DockingCustomPropertyProvider()); this.DataContext = new MainWindowViewModel(); InitializeComponent(); Dispatcher.ShutdownStarted += new EventHandler(DispatcherShutdownStarted); } private void DispatcherShutdownStarted(object sender, EventArgs e) { Dispatcher.ShutdownStarted -= new EventHandler(DispatcherShutdownStarted); SaveLayout(); } private void SaveLayout() { var storage = new IsolatedStorageProvider(); storage.SaveToStorage(); } private void LoadLayout() { var storage = new IsolatedStorageProvider(); storage.LoadFromStorage(); } private void BuildDockingLoaded(object sender, RoutedEventArgs e) { LoadLayout(); } }}<Window x:Class="BasicDockingPersistenceExample.MainWindow" xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" Title="MainWindow" Height="588" Width="876"> <telerik:RadDocking x:Name="BuildDocking" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Padding="2" HasDocumentHost="False" Loaded="BuildDockingLoaded" telerik:PersistenceManager.StorageId="BuildDocking"> <telerik:RadSplitContainer Orientation="Horizontal" InitialPosition="DockedBottom"> <telerik:RadPaneGroup > <telerik:RadPane x:Name="Pane1Panel" Header="Pane 1" telerik:RadDocking.SerializationTag="Pane1Panel" IsPinned="{Binding Path=Pane1PanelIsPinned, Mode=TwoWay}" CanUserClose="False" CanDockInDocumentHost="False"> </telerik:RadPane> </telerik:RadPaneGroup> </telerik:RadSplitContainer> <telerik:RadSplitContainer Orientation="Horizontal" InitialPosition="DockedLeft" > <telerik:RadPaneGroup telerik:ProportionalStackPanel.RelativeSize="200, 300"> <telerik:RadPane x:Name="Pane2Panel" Header="Pane 2" telerik:RadDocking.SerializationTag="Pane2Panel" IsPinned="{Binding Path=Pane2PanelIsPinned, Mode=TwoWay}" CanUserClose="False" CanDockInDocumentHost="False"> </telerik:RadPane> </telerik:RadPaneGroup> </telerik:RadSplitContainer> <telerik:RadSplitContainer Orientation="Horizontal" InitialPosition="DockedRight" MinWidth="300"> <telerik:RadPaneGroup > <telerik:RadPane Header="Pane 3" x:Name="Pane3Panel" telerik:RadDocking.SerializationTag="Pane3Panel" IsPinned="{Binding Path=Pane3PanelIsPinned, Mode=TwoWay}" CanUserClose="False" CanDockInDocumentHost="False" > </telerik:RadPane> </telerik:RadPaneGroup> </telerik:RadSplitContainer> <telerik:RadSplitContainer Orientation="Vertical" InitialPosition="DockedTop" MinHeight="100" > <telerik:RadPaneGroup > <telerik:RadPane Header="Pane 4" x:Name="Pane4Panel" telerik:RadDocking.SerializationTag="Pane4Panel" IsPinned="{Binding Path=Pane4PanelIsPinned, Mode=TwoWay}" CanUserClose="False" CanDockInDocumentHost="False" > </telerik:RadPane> </telerik:RadPaneGroup> </telerik:RadSplitContainer> <telerik:RadSplitContainer Orientation="Vertical" InitialPosition="DockedTop" MinHeight="100" > <telerik:RadPaneGroup > <telerik:RadPane Header="Pane 5" x:Name="Pane5Panel" telerik:RadDocking.SerializationTag="Pane5Panel" IsPinned="{Binding Path=Pane5PanelIsPinned, Mode=TwoWay}" CanUserClose="False" CanDockInDocumentHost="False" > </telerik:RadPane> </telerik:RadPaneGroup> </telerik:RadSplitContainer> </telerik:RadDocking></Window>
AUFNR FK1
TAG_POSITION FK2
COMPONENT
MESSAGE
I have a Grid and I have set as follows following the sample to show Table 1 data and on expand of row I would want to see filtered table 2 data with the relationship being AUFNR - but the child table seems to be ignoring the relationship I specified in xaml and just loading all the table 2 data?
I have changed self reference to False and True and it makes no difference....
The VB I am using to load the data is as follows
Dim vwSAPBatchesViewSource As System.Windows.Data.CollectionViewSource = CType(Me.FindResource("TblSAP_BatchesViewSource"), System.Windows.Data.CollectionViewSource)
vwSAPBatchesViewSource.Source = context.fnGetSapBatches
Child Table
Dim vwSAPComponentsViewSource As System.Windows.Data.CollectionViewSource = CType(Me.FindResource("TblSAP_ComponentsViewSource"), System.Windows.Data.CollectionViewSource)
vwSAPComponentsViewSource.Source = context.fnGetSapComponents
<Grid Margin="3" Grid.Column="1" Name="GridSAP"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <TextBlock x:Name="textBlock_Copy" TextWrapping="Wrap" Text="SAP Staging Table" FontFamily="Segoe UI" FontSize="13.333" VerticalAlignment="Center" FontStyle="Italic" Foreground="#FF969696" HorizontalAlignment="Center"/> <StackPanel x:Name="stkStaging" Orientation="Horizontal" Grid.Row="2" HorizontalAlignment="Right" VerticalAlignment="Top"/> <telerik:RadGridView ItemsSource="{Binding}" AutoGenerateColumns="False" x:Name="grdSAPBatches" DataContext="{StaticResource TblSAP_BatchesViewSource}" IsReadOnly="True" ShowGroupPanel="False" AlternateRowBackground="{x:Null}" Background="{x:Null}" ColumnBackground="#FF1E1E1E" Foreground="White" HorizontalGridLinesBrush="#FF323232" VerticalGridLinesBrush="#FF323232" RowIndicatorVisibility="Collapsed" BorderBrush="#FF0E0E0E" IsFilteringAllowed="False" CanUserFreezeColumns="False" ScrollViewer.CanContentScroll="True" VerticalAlignment="Top" d:LayoutOverrides="Width" Grid.Row="1" DataLoadMode="Asynchronous" HorizontalAlignment="Right" Style="{DynamicResource RadGridViewStyle_EPMS}" GroupRowStyle="{DynamicResource GridViewGroupRowStyle_EPMS}" GroupPanelBackground="#FF0E0E0E"> <telerik:RadGridView.ChildTableDefinitions> <telerik:GridViewTableDefinition> <telerik:GridViewTableDefinition.Relation> <telerik:TableRelation IsSelfReference="False"> <telerik:TableRelation.FieldNames> <telerik:FieldDescriptorNamePair ParentFieldDescriptorName="AUFNR" ChildFieldDescriptorName="AUFNR"/> </telerik:TableRelation.FieldNames> </telerik:TableRelation> </telerik:GridViewTableDefinition.Relation> </telerik:GridViewTableDefinition> </telerik:RadGridView.ChildTableDefinitions> <telerik:RadGridView.Columns> <telerik:GridViewDataColumn UniqueName="AUFNR" DataMemberBinding="{Binding AUFNR}" Header="Batch No." IsGroupable="False" IsFilterable="False"/> <telerik:GridViewDataColumn UniqueName="BATCH_TYPE" DataMemberBinding="{Binding BATCH_TYPE}" Header="Batch Type" IsGroupable="False" IsFilterable="False"/> <telerik:GridViewDataColumn UniqueName="ENGINE_TYPE" DataMemberBinding="{Binding ENGINE_TYPE}" Header="Part No." IsGroupable="False" IsFilterable="False"/> <telerik:GridViewDataColumn UniqueName="START_DATE" DataMemberBinding="{Binding START_DATE}" Header="Sched. Date" IsGroupable="False" IsFilterable="False"/> <telerik:GridViewDataColumn UniqueName="START_TIME" DataMemberBinding="{Binding START_TIME}" Header="Sched. Time" IsGroupable="False" IsFilterable="False"/> <telerik:GridViewDataColumn UniqueName="PROGRAMMED_QTY" DataMemberBinding="{Binding PROGRAMMED_QTY}" Header="Batch Qty" IsGroupable="False" IsFilterable="False"/> </telerik:RadGridView.Columns> <telerik:RadGridView.HierarchyChildTemplate> <DataTemplate> <telerik:RadGridView DataContext="{StaticResource TblSAP_ComponentsViewSource}" AutoGenerateColumns="False" x:Name="grdSAPComponents" ItemsSource="{Binding}" ShowGroupPanel="False" AlternateRowBackground="{x:Null}" Background="{x:Null}" ColumnBackground="#FF1E1E1E" Foreground="White" HorizontalGridLinesBrush="#FF323232" VerticalGridLinesBrush="#FF323232" RowIndicatorVisibility="Collapsed" BorderBrush="#FF0E0E0E" IsFilteringAllowed="True" CanUserFreezeColumns="False" ScrollViewer.CanContentScroll="True" VerticalAlignment="Top" d:LayoutOverrides="Width" Grid.Row="1" DataLoadMode="Asynchronous" HorizontalAlignment="Right" Style="{DynamicResource RadGridViewStyle_EPMS}"> <telerik:RadGridView.Columns> <telerik:GridViewDataColumn UniqueName="AUFNR" DataMemberBinding="{Binding AUFNR}" Header="Batch No." IsGroupable="True" IsFilterable="True"/> <telerik:GridViewDataColumn UniqueName="TAG_POSITION" DataMemberBinding="{Binding TAG_POSITION}" Header="Tag Position" IsGroupable="True" IsFilterable="True"/> <telerik:GridViewDataColumn UniqueName="COMPONENT" DataMemberBinding="{Binding COMPONENT}" Header="Component" IsGroupable="True" IsFilterable="True"/> <telerik:GridViewDataColumn UniqueName="HMI_MESSAGE" DataMemberBinding="{Binding HMI_MESSAGE}" Header="HMI Message" IsGroupable="True" IsFilterable="True"/> </telerik:RadGridView.Columns> </telerik:RadGridView> </DataTemplate> </telerik:RadGridView.HierarchyChildTemplate> </telerik:RadGridView> </Grid>
Any help much appreciated...
<telerik:RadWindow x:Class="WpfBrowserApplication1.TestWindow" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:telerik="clr-namespace:Telerik.Windows.Controls;assembly=Telerik.Windows.Controls.Navigation" Header="TestWindow" Height="300" Width="300"> <Grid Background="LightBlue"> <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center"> Test </TextBlock> </Grid></telerik:RadWindow><Application x:Class="WpfBrowserApplication1.App" Startup="Application_Startup" DispatcherUnhandledException="Application_DispatcherUnhandledException"> <!-- StartupUri="Page1.xaml" --> <Application.Resources> </Application.Resources></Application>using System.Windows;namespace WpfBrowserApplication1{ using System; /// <summary> /// Interaction logic for App.xaml /// </summary> public partial class App : Application { public App() { AppDomain.CurrentDomain.UnhandledException += (s, a) => HandleError((Exception)a.ExceptionObject); } private object HandleError(Exception exception) { throw new NotImplementedException(); } private void Application_Startup(object sender, StartupEventArgs e) { TestWindow newWindow = new TestWindow(); newWindow.ShowDialog(); } private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) { Console.WriteLine(); } }}<DataTemplate x:Key="TitleTemplate"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <ContentPresenter Content="{Binding}"/> <StackPanel Orientation="Horizontal" Grid.Column="1"> <ComboBox x:Name="Top" ItemsSource="{Binding Source={x:Static TopLevelElements}}"/> <ComboBox x:Name="Middle" ItemsSource="{Binding ElementName=Top, Path=SelectedItem.MiddleLevelElements}"/> </StackPanel> </Grid> </DataTemplate><!--xmlns declarations in example omitted for brevity--><UserControl x:Class="BottomItemView"> <Border> <ListBox x:Name="Bottom" ItemsSource="{Binding ElementName=Middle, Path=SelectedItem.BottomLevelElements}"/> </Border> </UserControl>Public Class CustomRadPane Inherits RadPane Public Sub New(ByVal title As Object) MyBase.New() Me.Title = title Me.TitleTemplate = TryCast(FindResource("TitleTemplate"), DataTemplate) Me.Content = System.Activator.CreateInstance(BottomItemView) End SubEnd Class