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
Sub
End
Class
<
ControlTemplate
TargetType
=
"{x:Type Telerik_Windows_Controls_TabControl:DropDownMenu}"
>
<
Grid
x:Name
=
"PopupContentElement"
Margin
=
"40,0,40,80"
RenderTransformOrigin
=
"0,0"
>
<
Grid.RenderTransform
>
<
TranslateTransform
X
=
"-40"
/>
</
Grid.RenderTransform
>
<
Border
BorderBrush
=
"#FF848484"
BorderThickness
=
"{TemplateBinding BorderThickness}"
Background
=
"White"
>
<
Border.Effect
>
<
DropShadowEffect
BlurRadius
=
"40"
Color
=
"Black"
Direction
=
"0"
Opacity
=
"0.85"
RenderingBias
=
"Quality"
ShadowDepth
=
"0"
/>
</
Border.Effect
>