views:

362

answers:

2

I have the following XAML code as part of a custom control:

<telerik:RadTreeView x:Name="treeModules"> 
    <telerik:RadTreeView.ItemTemplate> 
        <core:HierarchicalDataTemplate ItemsSource="{Binding Submodules}"> 
            <local:ModuleInfoUserControl IsReadOnly="{Binding ElementName=ctrlIsReadOnly, Path=IsReadOnly}"/> 
        </core:HierarchicalDataTemplate> 
    </telerik:RadTreeView.ItemTemplate> 
</telerik:RadTreeView>

Where:

  • The ItemsSource property of treeModules is set by code to a list of Module objects. The Module class has a property named Submodules, which consists on a collection of more Modules.
  • ModuleInfoUserControl is a custom control used to display module information. IsReadOnly is a dependency property declared on the control.
  • ctrlIsReadOnly is a hidden TextBox defined elsewhere in the main user control. It is used to make a bunch of controls editable or read only.

The problem: binding to ctrlIsReadOnly element in ModuleInfoUserControl does not work. The IsReadOnly property of it is always at its default state, even if the corresponding property of crlIsReadOnly changes.

But, if I change the RadTreeView into a standard Silverlight TreeView, and the HierarchicalDataTemplate into the standard Silverlight version too, it works as expected.


Ok, up to here I have pasted an exact copy of the support ticket I have sent to Telerik in the hope that they could help me. I must say that the reply has been quick and as efficient as it could be: they have said me that they could not reproduce the bug, and have send me a small test project that exercises the offending piece of code. The test project shows the bug on my machine, but works on Telerik's.

And here comes the really strange part. I have published Telerik's sample project on my personal site. Here is the link:

http://www.konamiman.com/TelerikTest/TestPage.html

The idea is that when pressing the "ToggleIsReadOnly" button, the "Root" TextBox should become read-only. But again, it works on Telerik's machines, but not on mine! So the application code itself is apparenly ok.

Thinking that it could be a problem on my machine's Silverlight runtime, I have tested a bunch of others, including: Spanish Windows 7 32 and 64 bits, Spanish Windows XP, English Windows Server 2008, and even on my wife's computer with Japanese Windows XP. On all of these, it does NOT work as expected.

So, what's happening here? I am completely stuck.

By the way, Silverlight Runtime I'm using is version 3.0.50106.0.

UPDATE: I have uploaded the source code of the test project as well. Here is the URL:

http://www.konamiman.com/TelerikTest/TreeViewTest.zip

+1  A: 

I have tried the test project now, and I can not get it to work. I have tried changing the thread culture to "en-US", but that does not help. It would appear that items controls a HierarchicalDataTemplate cannot bind to properties on elements outside of that datatemplate. I think you should get back to Telerik and ask them again if they are 100% sure that this works as expected on their machines. If it does, it is a very strange bug.

[EDIT]
I have found some more info, see the links below. It looks like this is a general silverlight problem. But it is still strange that the Telerik guy claims that it works on his machine.
http://forums.silverlight.net/forums/p/108804/267789.aspx

And here is a similar thing but with the Telerik GridView component:
http://www.telerik.com/community/forums/silverlight/gridview/elementname-binding-inside-of-celltemplate.aspx

Henrik Söderlund
Also, it is worth noting that with the standard Silverlight TreeView and HierarchicalDataTemplate, it works fine...
Konamiman
Ok. Interesting... That means it is definitely Teleriks problem. You should post this bug to them again. Maybe they just misunderstood the bug the first time around.
Henrik Söderlund
A: 

I have found an alternative approach that seems to work fine. Instead of defining ctrlIsReadOnly as part of the main user control tree, I define it as a static resource:

<UserControl.Resources>
    <TextBox x:Key="ctrlIsReadOnly" IsEnabled="True" IsReadOnly="False" Visibility="Collapsed" />
</UserControl.Resources>

Then I just have to slightly change the binding declaration on ModuleInfoUserControl:

<local:ModuleInfoUserControl IsReadOnly="{Binding Source={StaticResource ctrlIsReadOnly}, Path=IsReadOnly}"/>

I then access ctrlIsReadOnly from code this way: ((TextBox)this.Resources["ctrlIsReadOnly"])

Konamiman