Hi,
We have a requirement to have multiple isolated work spaces in our application (which we originally planned to host in RadTabbedWindow tabs).
Each of these work spaces need to have their own RadDocking set up and be navigable.
We are using implicit datatemplates for our MVVM infrastructure and binding ContentControls to viewmodels at runtime and we are having issues with the TabControl/Window datatemplate and the RadDocking framework.
The problems we are having are as follows:
1) When we bind an ObservableCollection of ViewModels to the ItemsSource property of the RadTabControl/RadTabbedWindow and we try to set up RadDocking in the TabControl/Window's ContentTemplate, an exception gets thrown.
Here's our the code:
<telerik:RadTabControl ItemsSource=
"{Binding WorkspaceViewModels}"
x:Name=
"WorkspaceContainer"
ScrollMode=
"Viewport"
SupressSelectedContentTemplateReapplying=
"True"
IsContentPreserved=
"True"
>
<!-- Event is only available with RadTabbedWindow
<telerik:EventToCommandBehavior.EventBindings>
<telerik:EventBinding EventName=
"AddingNewTab"
Command=
"{Binding AddWorkspaceCommand}"
/>
</telerik:EventToCommandBehavior.EventBindings>-->
<telerik:RadTabControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text=
"{Binding Title}"
/>
</StackPanel>
</DataTemplate>
</telerik:RadTabControl.ItemTemplate>
<telerik:RadTabControl.ContentTemplate>
<DataTemplate>
<telerik:RadDocking BorderThickness=
"0"
Padding=
"0"
>
<telerik:RadDocking.DocumentHost>
<telerik:RadSplitContainer>
<telerik:RadPaneGroup x:Name=
"PrimaryPaneGroup"
>
<ContentPresenter Content=
"{Binding}"
/>
</telerik:RadPaneGroup>
</telerik:RadSplitContainer>
</telerik:RadDocking.DocumentHost>
</telerik:RadDocking>
</DataTemplate>
</telerik:RadTabControl.ContentTemplate>
<telerik:RadTabControl.ItemContainerStyle>
<Style TargetType=
"telerik:RadTabItem"
>
<Setter Property=
"MinHeight"
Value=
"40"
/>
<Setter Property=
"FontWeight"
Value=
"Bold"
/>
<Setter Property=
"PinButtonVisibility"
Value=
"Visible"
/>
<Setter Property=
"CloseButtonVisibility"
Value=
"Visible"
/>
<Setter Property=
"IsSelected"
Value=
"{Binding IsActiveWorkspace}"
/>
</Style>
</telerik:RadTabControl.ItemContainerStyle>
</telerik:RadTabControl>
And here's the exception that gets thrown is as follows:
System.NullReferenceException
HResult=0x80004003
Message=Object reference not set to an instance of an object.
Source=Telerik.Windows.Controls.Docking
StackTrace:
at Telerik.Windows.Controls.RadPaneGroup.OnIsInDocumentHostChanged(Boolean oldValue, Boolean newValue)
at Telerik.Windows.Controls.RadPaneGroup.Telerik.Windows.Controls.Docking.IDocumentHostAware.set_IsInDocumentHost(Boolean value)
at Telerik.Windows.Controls.RadSplitContainer.PrepareContainerForItemOverride(DependencyObject element, Object item)
at System.Windows.Controls.ItemsControl.MS.Internal.Controls.IGeneratorHost.PrepareItemContainer(DependencyObject container, Object item)
at System.Windows.Controls.ItemContainerGenerator.System.Windows.Controls.Primitives.IItemContainerGenerator.PrepareItemContainer(DependencyObject container)
at System.Windows.Controls.Panel.GenerateChildren()
at System.Windows.Controls.Panel.EnsureGenerator()
at System.Windows.Controls.Panel.get_InternalChildren()
at Telerik.Windows.Controls.ProportionalStackPanel.MeasureOverride(Size availableSize)
at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
at System.Windows.UIElement.Measure(Size availableSize)
at MS.Internal.Helper.MeasureElementWithSingleChild(UIElement element, Size constraint)
at System.Windows.Controls.ItemsPresenter.MeasureOverride(Size constraint)
at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
at System.Windows.UIElement.Measure(Size availableSize)
at System.Windows.Controls.Border.MeasureOverride(Size constraint)
at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
at System.Windows.UIElement.Measure(Size availableSize)
at System.Windows.Controls.Grid.MeasureOverride(Size constraint)
at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
at System.Windows.UIElement.Measure(Size availableSize)
at System.Windows.Controls.Control.MeasureOverride(Size constraint)
at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
at System.Windows.UIElement.Measure(Size availableSize)
at MS.Internal.Helper.MeasureElementWithSingleChild(UIElement element, Size constraint)
at System.Windows.Controls.ContentPresenter.MeasureOverride(Size constraint)
at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
at System.Windows.UIElement.Measure(Size availableSize)
at System.Windows.Controls.Border.MeasureOverride(Size constraint)
at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
at System.Windows.UIElement.Measure(Size availableSize)
at System.Windows.Controls.Control.MeasureOverride(Size constraint)
at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
at System.Windows.UIElement.Measure(Size availableSize)
at Telerik.Windows.Controls.RadDockPanel.MeasureOverride(Size availableSize)
at Telerik.Windows.Controls.DockingPanel.MeasureOverride(Size availableSize)
at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
at System.Windows.UIElement.Measure(Size availableSize)
at Telerik.Windows.Controls.RadDockPanel.MeasureOverride(Size availableSize)
at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
at System.Windows.UIElement.Measure(Size availableSize)
at System.Windows.Controls.Border.MeasureOverride(Size constraint)
at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
at System.Windows.UIElement.Measure(Size availableSize)
at System.Windows.Controls.Grid.MeasureOverride(Size constraint)
at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
at System.Windows.UIElement.Measure(Size availableSize)
at System.Windows.Controls.Control.MeasureOverride(Size constraint)
at Telerik.Windows.Controls.RadDocking.MeasureOverride(Size availableSize)
at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
at System.Windows.UIElement.Measure(Size availableSize)
at MS.Internal.Helper.MeasureElementWithSingleChild(UIElement element, Size constraint)
at System.Windows.Controls.ContentPresenter.MeasureOverride(Size constraint)
at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
at System.Windows.UIElement.Measure(Size availableSize)
at System.Windows.Controls.Grid.MeasureOverride(Size constraint)
at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
at System.Windows.UIElement.Measure(Size availableSize)
at System.Windows.ContextLayoutManager.UpdateLayout()
at System.Windows.ContextLayoutManager.UpdateLayoutCallback(Object arg)
at System.Windows.Media.MediaContext.InvokeOnRenderCallback.DoWork()
at System.Windows.Media.MediaContext.FireInvokeOnRenderCallbacks()
at System.Windows.Media.MediaContext.RenderMessageHandlerCore(Object resizedCompositionTarget)
at System.Windows.Media.MediaContext.RenderMessageHandler(Object resizedCompositionTarget)
at System.Windows.Media.MediaContext.Resize(ICompositionTarget resizedCompositionTarget)
at System.Windows.Interop.HwndTarget.OnResize()
at System.Windows.Interop.HwndTarget.HandleMessage(WindowMessage msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Interop.HwndSource.HwndTargetFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
2) We have found that we can fix this issue and prevent the NullReferenceException by modifying the code above and adding a RadTabItem wrapper to the ContentTemplate like this:
<telerik:RadTabControl.ContentTemplate>
<DataTemplate DataType=
"{x:Type vms:WorkspaceViewModel}"
>
<telerik:RadTabItem>
<telerik:RadDocking BorderThickness=
"0"
Padding=
"0"
>
<telerik:RadDocking.DocumentHost>
<telerik:RadSplitContainer>
<telerik:RadPaneGroup x:Name=
"PrimaryPaneGroup"
>
<ContentPresenter Content=
"{Binding}"
/>
</telerik:RadPaneGroup>
</telerik:RadSplitContainer>
</telerik:RadDocking.DocumentHost>
</telerik:RadDocking>
</telerik:RadTabItem>
</DataTemplate>
</telerik:RadTabControl.ContentTemplate>
The problem, however, is that this makes the entire central pane basically act like a button (see attached picture ), where hovering over the pane changes the color of the entire screen.
Neither one of these gets us any closer to what we really need: a bindable RadTabbedWindow with a dynamic/templatable/bindable RadDocking setup on each tab.
I would really appreciate any pointers or help on this!
Thank you so much for your time.
Tim