2009-09-04 4 views
1

Что такое хороший способ получить элементы управления в DataTemplate? Я использовал технику передачи события Loaded для контроля интереса, а также с помощью VisualTreeHelper для просмотра визуального дерева, и ни один из них не очень изящный. Каков хороший способ доступа к элементам управления DataTemplate?Программный доступ к элементу управления с DataTemplate

В одном примере мне нужно добавить привязку whos ConverterParameter не знает во время разработки, и поскольку привязка к ConverterParameters не поддерживается, мне нужно создать привязку в коде. В идеале я хотел бы иметь возможность сделать это где-то иначе, чем обработчик события Loaded для элемента управления в datatemplate.

Фактически, в этом случае обработка событий не работает вообще и вызывает исключение OutOfMemoryException. Вот моя попытка:

Generic.xaml:

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:SilverlightTest"> 


    <Style TargetType="local:TemplatedControl"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="local:TemplatedControl"> 
        <ListBox ItemsSource="{TemplateBinding ListBoxItemsSource}"> 
         <ListBox.ItemTemplate> 
          <DataTemplate> 
           <TextBlock x:Name="SomeTextBlock" 
            Loaded="SomeTextBlock_Loaded"/> 
          </DataTemplate> 
         </ListBox.ItemTemplate> 
        </ListBox> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ResourceDictionary> 

templatedcontrol.cs:

public class TemplatedControl : Control 
    { 
     public object ListBoxItemsSource 
     { 
      get { return (object)GetValue(ListBoxItemsSourceProperty); } 
      set { SetValue(ListBoxItemsSourceProperty, value); } 
     } 

     public static readonly DependencyProperty ListBoxItemsSourceProperty = 
      DependencyProperty.Register 
      ("ListBoxItemsSource", typeof(object), 
      typeof(TemplatedControl), new PropertyMetadata(null)); 

     public TemplatedControl() 
     { 
      this.DefaultStyleKey = typeof(TemplatedControl); 
     } 

     public void SomeTextBlock_Loaded(object sender, RoutedEventArgs ea) 
     { 
     } 
    } 
+0

Не могли бы вы рассказать об этом немного, чтобы включить сценарий, где это было бы полезно? –

+0

Добавляя к вопросу ... –

ответ

1

Вы могли бы иметь другой элемент управления в вашем DataTemplate, чтобы справиться с этим, но это своего рода грязный и с оговорка «если вы действительно не верите, что логика оправдывает это».

Возможно, вы захотите пересмотреть свой подход. По-моему (и это всего лишь мнение!), Нужно только привязывать в коде более экзотических ситуациях.

Возможно, вместо использования IValueConverter привяжите свойство к ViewModel (предполагая, что ваш ItemsSource является коллекцией ViewModels), и пусть ваша виртуальная машина преобразует ваши значения соответствующим образом. Пусть ваш стиль по умолчанию для этого элемента управления является общим и уродливым и, возможно, использует определенные стили для случаев, когда вам нужно привязываться к определенным свойствам.