Binding to XamlDataProvider not working

16 posts, 0 answers
  1. Philip
    Philip avatar
    10 posts
    Member since:
    Jun 2010

    Posted 11 Mar 2011 Link to this post

    Having followed your example to bind a XamlDataProvider to a RadRichTextBox, nothing is appearing. The Xaml property of the XamlDataProvider is bound to the Text property of a textbox, and the text is definitely a valid RadDocument (it's the output of exporting a raddocument to xaml using the XamlFormatProvider). The RichTextBox property is also bound correctly, so why isn't it working?

    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>
  2. hwsoderlund
    hwsoderlund avatar
    419 posts
    Member since:
    Aug 2006

    Posted 11 Mar 2011 Link to this post

    You need to set Mode=TwoWay on your binding.
  3. DevCraft banner
  4. Philip
    Philip avatar
    10 posts
    Member since:
    Jun 2010

    Posted 11 Mar 2011 Link to this post

    Already tried that, doesn't work
  5. Ivailo Karamanolev
    Admin
    Ivailo Karamanolev avatar
    276 posts

    Posted 16 Mar 2011 Link to this post

    Hello hwsoderlund,

    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
    Registration for Q1 2011 What’s New Webinar Week is now open. Mark your calendar for the week starting March 21st and book your seat for a walk through all the exciting stuff we ship with the new release!
  6. hwsoderlund
    hwsoderlund avatar
    419 posts
    Member since:
    Aug 2006

    Posted 16 Mar 2011 Link to this post

    Hi Ivailo. For once I am not the one with problems. :) It is Philip you should address.
  7. hwsoderlund
    hwsoderlund avatar
    419 posts
    Member since:
    Aug 2006

    Posted 18 Mar 2011 Link to this post

    I just now stumbled upon a situation that causes the exact symptoms that Philip describes, and that used to work before (sorry, I cannot be more specific than that, I do not know when it stopped working). I do not have time to post a sample project right now, but this occurs when the object being bound to is null at the time of loading (and rendering) the radrichtextbox. Example:

    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?
  8. Iva Toteva
    Admin
    Iva Toteva avatar
    1319 posts

    Posted 23 Mar 2011 Link to this post

    Hello hwsoderlund,

    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.

    Kind regards,
    Iva
    the Telerik team
  9. hwsoderlund
    hwsoderlund avatar
    419 posts
    Member since:
    Aug 2006

    Posted 23 Mar 2011 Link to this post

    Ok, that is a nice improvement. And I can confirm that it works as expected.
  10. Daní
    Daní avatar
    303 posts
    Member since:
    Feb 2008

    Posted 25 Mar 2011 Link to this post

    Hello,

    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]

  11. Ivailo Karamanolev
    Admin
    Ivailo Karamanolev avatar
    276 posts

    Posted 29 Mar 2011 Link to this post

    Hi Daní,

    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
  12. Daní
    Daní avatar
    303 posts
    Member since:
    Feb 2008

    Posted 29 Mar 2011 Link to this post

    Hi Ivailo,

    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>
  13. Daní
    Daní avatar
    303 posts
    Member since:
    Feb 2008

    Posted 30 Mar 2011 Link to this post

    Hello,

    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();
            }
        }
  14. Ivailo Karamanolev
    Admin
    Ivailo Karamanolev avatar
    276 posts

    Posted 31 Mar 2011 Link to this post

    Hi Daní,

    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
  15. Daní
    Daní avatar
    303 posts
    Member since:
    Feb 2008

    Posted 31 Mar 2011 Link to this post

    Hi Ivailo,

    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.
  16. Ivailo Karamanolev
    Admin
    Ivailo Karamanolev avatar
    276 posts

    Posted 31 Mar 2011 Link to this post

    Hi Daní,

    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
  17. Daní
    Daní avatar
    303 posts
    Member since:
    Feb 2008

    Posted 31 Mar 2011 Link to this post

    Thanks Ivailo,

    I'm waiting expectant for uor improvements.
Back to Top
DevCraft banner