Очень странная ошибка при использовании привязки данных к элементу под Telerik RadTreeView - PullRequest
1 голос
/ 19 февраля 2010

У меня есть следующий код XAML как часть пользовательского элемента управления:

<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>

Где:

  • Свойство ItemsSource treeModules устанавливается по коду в список Module объектов. Module класс имеет свойство с именем Submodules, который состоит из коллекции больше модулей.
  • ModuleInfoUserControl это обычай управление используется для отображения модуля Информация. IsReadOnly является свойство зависимости объявлено на управление.
  • ctrlIsReadOnly - это скрытый текстовый ящик определены в другом месте в основном пользователе контроль. Это используется, чтобы сделать кучу элементов управления редактируемые или только для чтения.

Проблема: привязка к элементу ctrlIsReadOnly в ModuleInfoUserControl не работает. Свойство IsReadOnly всегда находится в состоянии по умолчанию, даже если соответствующее свойство crlIsReadOnly изменяется.

Но , если я изменю RadTreeView на стандартный Silverlight TreeView и HierarchicalDataTemplate на стандартную версию Silverlight, он будет работать как положено.


Хорошо, до сих пор я вставил точную копию билета поддержки, который я отправил Telerik в надежде, что они могут мне помочь. Я должен сказать, что ответ был быстрым и настолько эффективным, насколько это возможно: они сказали мне, что не могут воспроизвести ошибку, и прислали мне небольшой тестовый проект, который выполняет оскорбительный фрагмент кода. Тестовый проект показывает ошибку на моей машине, но работает на Telerik.

И тут начинается действительно странная часть. Я опубликовал пример проекта Telerik на своем персональном сайте. Вот ссылка:

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

Идея состоит в том, что при нажатии кнопки «ToggleIsReadOnly» текстовый блок «Root» должен стать доступным только для чтения. Но опять же, это работает на машинах Telerik, но не на моей! Так что сам код приложения выглядит нормально.

Думая, что это может быть проблемой во время выполнения Silverlight на моей машине, я протестировал кучу других, в том числе: испанскую Windows 7 32 и 64-битную, испанскую Windows XP, английскую Windows Server 2008 и даже на компьютере моей жены с Японская Windows XP. На всех них он НЕ работает, как ожидалось .

Итак, что здесь происходит? Я полностью застрял.

Кстати, Silverlight Runtime, который я использую, это версия 3.0.50106.0.

ОБНОВЛЕНИЕ: Я также загрузил исходный код тестового проекта. Вот URL:

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

Ответы [ 2 ]

1 голос
/ 19 февраля 2010

Я попробовал тестовый проект сейчас, и я не могу заставить его работать. Я пытался изменить культуру потоков на «en-US», но это не помогает. Может показаться, что элементы управления HierarchicalDataTemplate не могут привязываться к свойствам элементов вне этой таблицы данных. Я думаю, вам следует вернуться к Telerik и спросить их снова, уверены ли они на 100%, что это работает, как и ожидалось, на их машинах. Если это так, то это очень странная ошибка.

[EDIT]
Я нашел больше информации, см. Ссылки ниже. Похоже, это общая проблема Silverlight. Но все же странно, что парень из Telerik утверждает, что он работает на его машине.
http://forums.silverlight.net/forums/p/108804/267789.aspx

А вот аналогичная вещь, но с компонентом Telerik GridView:
http://www.telerik.com/community/forums/silverlight/gridview/elementname-binding-inside-of-celltemplate.aspx

0 голосов
/ 22 февраля 2010

Я нашел альтернативный подход, который, кажется, работает нормально. Вместо определения ctrlIsReadOnly как части основного дерева пользовательского элемента управления, я определяю его как статический ресурс:

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

Тогда мне просто нужно немного изменить объявление привязки в ModuleInfoUserControl:

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

Затем я получаю доступ к ctrlIsReadOnly из кода следующим образом: ((TextBox)this.Resources["ctrlIsReadOnly"])

...