code:
<
UserControl.Resources
>
<
TelerikXaml:XamlDataProvider
x:Key
=
"DocumentDataSouce"
RichTextBox
=
"{Binding ElementName=EditBox}"
Xaml
=
"{Binding Path=Text, ElementName=RichTextBoxDataSource}"
/>
</
UserControl.Resources
>
<
Grid
Margin
=
"10"
>
<
Grid.ColumnDefinitions
>
<
ColumnDefinition
Width
=
"*"
/>
</
Grid.ColumnDefinitions
>
<
Grid.RowDefinitions
>
<
RowDefinition
Height
=
"25"
/>
<
RowDefinition
Height
=
"40"
/>
<
RowDefinition
Height
=
"*"
/>
</
Grid.RowDefinitions
>
<
Border
CornerRadius
=
"10, 10, 0, 0"
Background
=
"{StaticResource OrangeGradient}"
BorderThickness
=
"1"
BorderBrush
=
"{StaticResource DarkOrange}"
Grid.Row
=
"0"
>
<
TextBlock
VerticalAlignment
=
"Center"
HorizontalAlignment
=
"Center"
Style
=
"{StaticResource DarkOrangeHeaderText}"
Text
=
"Edit Report"
/>
</
Border
>
<
Border
Background
=
"White"
Grid.Row
=
"1"
Grid.RowSpan
=
"2"
/>
<
StackPanel
Orientation
=
"Horizontal"
Grid.Row
=
"1"
>
<
Button
x:Name
=
"ExportButton"
Content
=
"Export"
Click
=
"ExportButton_Click"
/>
<
Button
x:Name
=
"ImportButton"
Content
=
"Import"
Margin
=
"10, 0, 0, 0"
Click
=
"ImportButton_Click"
/>
<
TextBox
x:Name
=
"RichTextBoxDataSource"
Margin
=
"10, 0, 0, 0"
/>
</
StackPanel
>
<
Telerik:RadRichTextBox
x:Name
=
"EditBox"
Grid.Row
=
"2"
/>
</
Grid
>
15 Answers, 1 is accepted
We haven't encountered any issues with XamlDataProvider itself yet. Please provide us with a sample project that demonstrates the problem so we can give you further advice.
Greetings,
Ivailo
the Telerik team
MainPage.xaml contains a radrichtextbox with a xamldataprovider. The xamldataprovider binds its Xaml property like so:
Xaml="{Binding XamlContent, Mode=TwoWay}"
When the page is loaded, the DataContext of MainPage is null. A service call is then initated to pick up a XamlEntity with the property XamlContent. This object is then set as the DataContext of MainPage when it is returned from the service. But when it is set, the xamldataprovider will not react to the fact that there is suddenly an object to bind to. I am 100% certain that this used to work.
I can quite easily work around the problem by creating an empty XamlEntity with an empty string for the XamlContent in the constructor of MainPage. Then when the object is loaded from the server I just populate the existing DataContext with the values from the new XamlEntity. But I wish I would not have to. I am guessing that this is also the cause of Philips problems. @Philip: Can you confirm this?
Thank you for taking the time to investigate the issue.
We managed to reproduce the behavior on our side and the problem is indeed present in the scenario you are describing - when changing the DataContext that the data provider uses. It seems that in this case the binding expression is not automatically updated and therefore, the document does not show the new data.
However, since Q1, all data providers are FrameworkElements, which allows you to put them in the visual tree along with the RadRichTextBox. This enables the Silverlight runtime to properly update the binding expression on the data provider. This will not change anything whatsoever in the appearance, as data providers have no visual representation, but the binding will work correctly upon changing the DataContext.
Iva
the Telerik team
When debugging, I usually set VS to break each time an exception is thrown, also if is a handled one, and I also set "Disable just my code" in IntelliTrace. Well, since upgrade to Q1 2011 release, VS breaks continually due a handled exception produced when RichTextBox imports the document ising a XamlDataProvider. I'm using RichTextBox in readonly mode inside a paged ListBox, as page size is 8, VS breaks 8 times.
As I said, this is a handled exception, unsetting VS to break on throw exceptions an enabling "just my code" in IntelliTrace avoids VS to halt, but I think this exception is slowing down the UI, I can notice that loading the ListBox is slower than before Q1 2011 release. I'm pasting exception call stack:
Telerik.Windows.Documents!Telerik.Windows.Documents.Model.RadDocument.RebuildListDataOld(Telerik.Windows.Documents.Model.RadDocument document) + 0x77 bytes
Telerik.Windows.Documents!Telerik.Windows.Documents.Model.RadDocument.RebuildListsData(Telerik.Windows.Documents.Model.RadDocument document) + 0x1e bytes
Telerik.Windows.Documents.FormatProviders.Xaml!Telerik.Windows.Documents.FormatProviders.Xaml.XamlFormatProvider.Import(string input) + 0x9e bytes
Telerik.Windows.Documents!Telerik.Windows.Documents.FormatProviders.DataProviderBase.UpdateDocument() + 0x5f bytes
Telerik.Windows.Documents!Telerik.Windows.Documents.FormatProviders.DataProviderBase.RichTextBoxChangedCallback(System.Windows.DependencyObject sender, System.Windows.DependencyPropertyChangedEventArgs e) + 0x101 bytes
Telerik.Windows.Controls!Telerik.Windows.PropertyMetadata.Create.AnonymousMethod__0(System.Windows.DependencyObject d, System.Windows.DependencyPropertyChangedEventArgs e) + 0x283 bytes
System.Windows.dll!System.Windows.DependencyObject.RaisePropertyChangeNotifications(System.Windows.DependencyProperty dp, object oldValue, object newValue) + 0x51 bytes
System.Windows.dll!System.Windows.DependencyObject.UpdateEffectiveValue(System.Windows.DependencyProperty property, System.Windows.EffectiveValueEntry oldEntry, ref System.Windows.EffectiveValueEntry newEntry, System.Windows.DependencyObject.ValueOperation operation) + 0xf6 bytes
System.Windows.dll!System.Windows.DependencyObject.SetValueInternal(System.Windows.DependencyProperty dp, object value, bool allowReadOnlySet) + 0x2ad bytes
System.Windows.dll!System.Windows.Data.BindingOperations.SetBinding(System.Windows.DependencyObject target, System.Windows.DependencyProperty dp, System.Windows.Data.BindingBase binding) + 0xd1 bytes
System.Windows.dll!System.Windows.Data.Binding.MS.Internal.IMarkupExtension.SetupExtension(object target, object property) + 0x56 bytes
System.Windows.dll!MS.Internal.XamlManagedRuntimeRPInvokes.TryApplyMarkupExtensionValue(object target, MS.Internal.XamlPropertyToken propertyToken, object value) + 0x7d bytes
System.Windows.dll!MS.Internal.XamlManagedRuntimeRPInvokes.SetValue(MS.Internal.XamlTypeToken inType, ref MS.Internal.XamlQualifiedObject inObj, MS.Internal.XamlPropertyToken inProperty, ref MS.Internal.XamlQualifiedObject inValue) + 0x5e bytes
[Managed to Native Transition]
System.Windows.dll!MS.Internal.XcpImports.FrameworkElement_MeasureOverride(System.Windows.FrameworkElement element, System.Windows.Size availableSize) + 0x62 bytes
System.Windows.dll!System.Windows.FrameworkElement.MeasureOverride(System.Windows.Size availableSize) + 0x18 bytes
System.Windows.dll!System.Windows.FrameworkElement.MeasureOverride(System.IntPtr nativeTarget, float inWidth, float inHeight, out float outWidth, out float outHeight) + 0xa3 bytes
[Managed to Native Transition]
System.Windows.dll!MS.Internal.XcpImports.FrameworkElement_MeasureOverride(System.Windows.FrameworkElement element, System.Windows.Size availableSize) + 0x62 bytes
System.Windows.dll!System.Windows.FrameworkElement.MeasureOverride(System.Windows.Size availableSize) + 0x18 bytes
System.Windows.dll!System.Windows.FrameworkElement.MeasureOverride(System.IntPtr nativeTarget, float inWidth, float inHeight, out float outWidth, out float outHeight) + 0xa3 bytes
[Appdomain Transition]
What's happening in your case is most probably that the first time, the XamlFormatProvider is passed an empty string. As the empty string is not valid XAML, the XamlFormatProvider throws an exception, the fact that it comes from RebuildListsData is just a side effect. You can always initialize your property to some predefined value, e.g. an empty document exported to XAML and avoid the exception if you deem necessary.
All the best,
Ivailo
the Telerik team
XamlText property (in my ViiewModel object) never is empty. Debugging the application I may observe the exception is thrown before XamlDataProvider tries to get XamlText property in its DataContext object. I've placed a break point at XamlText property get accessor. Firstly, exception is thrown and then debugger breaks on the XamlText property. This didn't occur before Q1 2011 release. Walking by the exception call stack I can see a Telerik.Windows.Documents.FormatProviders.DataProviderBase.RichTextBoxChangedCallback method call that originates a DataProviderBase.UpdateDocument call. As now XamlDataProviderBase is a control, it seems the RichTextBoxChangedCallback is called before OnApplyTemplate and control is trying to format Xaml property when is not bound yet.
As I mentioned previously, I'm using a RichTextBox in readonly mode inside a ListBox, I'm pasting the DataTemplate used for ListBox ItemTemplate, may this may help:
<
DataTemplate
x:Key
=
"AnnotationViewTemplate"
>
<
Border
BorderBrush
=
"Black"
BorderThickness
=
"0,0,0,2"
Padding
=
"0,0,0,5"
>
<
Grid
x:Name
=
"LayoutRoot"
>
<
Grid.RowDefinitions
>
<
RowDefinition
Height
=
"Auto"
/>
<
RowDefinition
/>
</
Grid.RowDefinitions
>
<
telerik:RadWrapPanel
Grid.Row
=
"0"
>
<
telerik:RadRibbonButton
VerticalAlignment
=
"Center"
Command
=
"{Binding Path=CopyCommand, ElementName=copyBehavior}"
telerik:ScreenTip.Title
=
"{Binding Path=CopyAnnotationTitle, Source={StaticResource Strings}}"
telerik:ScreenTip.Description
=
"{Binding Path=CopyAnnotationDescription, Source={StaticResource Strings}}"
CollapseToSmall
=
"WhenGroupIsMedium"
Size
=
"Medium"
SmallImage
=
"/Telerik.Windows.Controls.RichTextBoxUI;component/Images/MSOffice/16/copy.png"
FontSize
=
"9.333"
Margin
=
"0,0,5,0"
/>
<
StackPanel
Margin
=
"5,5,15,5"
Orientation
=
"Horizontal"
Visibility
=
"{Binding FormattedDate, Converter={StaticResource TextLengthToVisibilityConverter}}"
>
<
TextBlock
TextWrapping
=
"Wrap"
Text
=
"{Binding Path=AnnotationDateLabel, Source={StaticResource Strings}}"
Margin
=
"0,0,6,0"
Style
=
"{StaticResource LabelTextStyle}"
/>
<
TextBlock
Style
=
"{StaticResource DataHighlightTextBlock}"
Text
=
"{Binding FormattedDate}"
telerik:ScreenTip.Title
=
"{Binding Path=AnnotationDateLabel, Source={StaticResource Strings}}"
telerik:ScreenTip.Description
=
"{Binding FormattedDate}"
/>
</
StackPanel
>
<
StackPanel
Margin
=
"5,5,15,5"
Orientation
=
"Horizontal"
Visibility
=
"{Binding Responsible, Converter={StaticResource TextLengthToVisibilityConverter}}"
>
<
TextBlock
TextWrapping
=
"Wrap"
Text
=
"{Binding AnnotationResponsibleLabel, Source={StaticResource Strings}}"
Margin
=
"0,0,6,0"
Style
=
"{StaticResource LabelTextStyle}"
/>
<
TextBlock
Style
=
"{StaticResource DataHighlightTextBlock}"
Text
=
"{Binding Responsible}"
telerik:ScreenTip.Title
=
"{Binding AnnotationResponsibleLabel, Source={StaticResource Strings}}"
telerik:ScreenTip.Description
=
"{Binding Responsible}"
/>
</
StackPanel
>
<
StackPanel
Orientation
=
"Horizontal"
Margin
=
"5"
Visibility
=
"{Binding SpecialityDescription, Converter={StaticResource TextLengthToVisibilityConverter}}"
>
<
TextBlock
TextWrapping
=
"Wrap"
Text
=
"{Binding AnnotationSpecialityLabel, Source={StaticResource Strings}}"
Margin
=
"0,0,6,0"
Style
=
"{StaticResource LabelTextStyle}"
/>
<
TextBlock
Style
=
"{StaticResource DataTextStyleWordEllipses}"
Text
=
"{Binding SpecialityDescription}"
telerik:ScreenTip.Title
=
"{Binding Path=AnnotationSpecialityTitle, Source={StaticResource Strings}}"
telerik:ScreenTip.Description
=
"{Binding SpecialityDescription}"
/>
</
StackPanel
>
<
StackPanel
Orientation
=
"Horizontal"
Margin
=
"5,5,15,5"
Visibility
=
"{Binding Episode, Converter={StaticResource TextLengthToVisibilityConverter}}"
>
<
TextBlock
TextWrapping
=
"Wrap"
Text
=
"{Binding Path=AnnotationEpisodeLabel, Source={StaticResource Strings}}"
Margin
=
"0,0,6,0"
Style
=
"{StaticResource LabelTextStyle}"
/>
<
TextBlock
Style
=
"{StaticResource DataHighlightTextBlock}"
Text
=
"{Binding Episode}"
telerik:ScreenTip.Title
=
"{Binding Path=AnnotationEpisodeLabel, Source={StaticResource Strings}}"
telerik:ScreenTip.Description
=
"{Binding Episode}"
/>
</
StackPanel
>
<
StackPanel
Orientation
=
"Horizontal"
Margin
=
"5,5,15,5"
Visibility
=
"{Binding TreatmentUnityDescription, Converter={StaticResource TextLengthToVisibilityConverter}}"
>
<
TextBlock
TextWrapping
=
"Wrap"
Text
=
"{Binding AnnotationTreatmentUnityDescriptionLabel, Source={StaticResource Strings}}"
Margin
=
"0,0,6,0"
Style
=
"{StaticResource LabelTextStyle}"
/>
<
TextBlock
Style
=
"{StaticResource DataTextStyleWordEllipses}"
Text
=
"{Binding TreatmentUnityDescription}"
telerik:ScreenTip.Title
=
"{Binding Path=TreatmentUnityTitle, Source={StaticResource Strings}}"
telerik:ScreenTip.Description
=
"{Binding TreatmentUnityDescription}"
/>
</
StackPanel
>
<
StackPanel
Orientation
=
"Horizontal"
Margin
=
"5"
Visibility
=
"{Binding ServiceText, Converter={StaticResource TextLengthToVisibilityConverter}}"
>
<
TextBlock
TextWrapping
=
"Wrap"
Margin
=
"0,0,6,0"
Text
=
"{Binding Path=AnnotationServiceLabel, Source={StaticResource Strings}}"
Style
=
"{StaticResource LabelTextStyle}"
/>
<
TextBlock
Style
=
"{StaticResource DataHighlightTextBlock}"
Text
=
"{Binding ServiceText}"
telerik:ScreenTip.Title
=
"{Binding Path=AnnotationServiceLabel, Source={StaticResource Strings}}"
telerik:ScreenTip.Description
=
"{Binding ServiceText}"
/>
</
StackPanel
>
<
StackPanel
Orientation
=
"Horizontal"
Margin
=
"5"
Visibility
=
"{Binding Path=IsDisabled, Converter={StaticResource BooleanToVisibilityConverter}}"
>
<
TextBlock
TextWrapping
=
"Wrap"
Margin
=
"0,0,6,0"
Text
=
"{Binding Path=AnnotationDisablingDateLabel, Source={StaticResource Strings}}"
Style
=
"{StaticResource LabelTextStyle}"
/>
<
TextBlock
Style
=
"{StaticResource DataHighlightTextBlock}"
Text
=
"{Binding FormattedDisablingDate}"
telerik:ScreenTip.Title
=
"{Binding Path=AnnotationDisablingDateLabel, Source={StaticResource Strings}}"
telerik:ScreenTip.Description
=
"{Binding FormattedDisablingDate}"
/>
</
StackPanel
>
</
telerik:RadWrapPanel
>
<
telerik:RadRichTextBox
BorderThickness
=
"0"
Grid.Row
=
"1"
IsSelectionMiniToolBarEnabled
=
"False"
HorizontalContentAlignment
=
"Stretch"
IsContextMenuEnabled
=
"True"
DocumentInheritsDefaultStyleSettings
=
"True"
FontFamily
=
"Verdana"
FontSize
=
"12"
IsSpellCheckingEnabled
=
"False"
Width
=
"Auto"
VerticalScrollBarVisibility
=
"Disabled"
x:Name
=
"RichTextBox"
IsReadOnly
=
"True"
HorizontalScrollBarVisibility
=
"Disabled"
>
<
i:Interaction.Behaviors
>
<
localBehaviors:RichTextBoxCopyBehavior
x:Name
=
"copyBehavior"
/>
</
i:Interaction.Behaviors
>
</
telerik:RadRichTextBox
>
<
telerikXaml:XamlDataProvider
Grid.Row
=
"1"
Xaml
=
"{Binding Path=XamlText, Mode=TwoWay}"
RichTextBox
=
"{Binding ElementName=RichTextBox}"
ccBehaviors:DefaultLineSpacingBehavior.DefaultLineSpacing
=
"1"
/>
</
Grid
>
</
Border
>
</
DataTemplate
>
I think I can confirm my previous post. It seems there's an issue on XamlDataProvider initialization. The following code produces a handled exception :
public
class
Test
public
string
XamlText {
get
;
set
; }
public
RadRichTextBox RichTextBox {
get
;
set
; }
public
void
UpdateXaml()
{
var xamlProvider =
new
XamlDataProvider { RichTextBox = RichTextBox };
xamlProvider.Xaml = XamlText;
xamlProvider.UpdateDocument();
}
}
This code does not produce the handled exception:
public
class
Test
{
public
string
XamlText {
get
;
set
; }
public
RadRichTextBox RichTextBox {
get
;
set
; }
public
void
UpdateXaml()
{
var xamlProvider =
new
XamlDataProvider { Xaml = XamlText, RichTextBox = RichTextBox };
xamlProvider.UpdateDocument();
}
}
You are correct in the statement that when you change the value of the RichTextBox property of the data provider, a call to UpdateDocument is made, which throws a handled exception. This has been changed in Q1 to achieve behavior more like the one standard controls. If the handled exception presents any particular problem, let us know, but generally, it shouldn't be.
Best wishes,
Ivailo
the Telerik team
The handled exception doesn' present any problem to me, it just seems that loading a ListBox with several RichTextBox is slower than before (before Q1 2011). As I'm developping an application that replaces an old one, my view model objects may have XamlText property empty (those generated with the old application) and I need to use a PlainText property. In this scenario I created a custom behavior with a RichTextBox dependency property, when my view model XamlText is not empty, it creates a XamlDataProvider to update RichTextBox document, when XamlText is empty, it creates a TxTDataProvider to update RichTextBox document with PlainText supplied, so I'm instanciating XamlDataProvider by C# code and I can avoid the handled exception.
We will make a review of the behavior so that if the Xaml property is empty, an empty document will be loaded in the RadRichTextBox without any exceptions being thrown. This change will be visible in the next minor release (Q1 SP1). Additionally, some new features have been added since the last release which may have certain performance impact. However, as these features get more mature, the performance generally improves as we are doing our best to make our controls as fast as possible.
Kind regards,
Ivailo
the Telerik team
I'm waiting expectant for uor improvements.