2009-09-04 38 views
1

獲取DataTemplate中控件的好方法是什麼?我已經使用了處理感興趣控件的Loaded事件的技巧,並且使用VisualTreeHelper來遍歷視覺樹,而這些都不是很優雅。訪問DataTemplate控件的好方法是什麼?以編程方式從DataTemplate訪問控件

在一個示例中,我需要添加綁定whos ConverterParameter在設計時不知道,並且由於不支持綁定到ConverterParameters,所以我需要在代碼中創建綁定。理想情況下,我希望能夠在數據模板中的控件之外的Loaded事件處理程序之外執行此操作。

事實上,在這種情況下,處理事件根本不起作用,並導致出現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

請問您是否可以擴展這一點以包含一個可能有用的場景? – 2009-09-07 13:54:34

+0

添加到問題... – 2009-09-09 20:14:40

回答

1

你可以在你的DataTemplate來處理另一個控制,但是這是一種凌亂也與告誡「除非你真的相信這個邏輯是正當的」。

您可能想重新考慮您的方法。在我看來(這只是一個意見!),只應該在更多的異國情調情況下的代碼綁定。

可能不是使用IValueConverter,而是綁定到ViewModel上的屬性(假設您的ItemsSource是ViewModel的集合),並讓您的VM相應地轉換您的值。讓您的此控件的默認樣式爲通用且醜陋的,並且可能會在需要綁定到特定屬性時使用特定樣式。

相關問題