2009-09-04 11 views
1

DataTemplateのコントロールを取得する良い方法はありますか?私はVisualTreeHelperを使用して視覚ツリーを歩くだけでなく、それらのどれも非常にエレガントではなく、関心のコントロールにLoadedイベントを渡すテクニックを使用しました。 DataTemplateコントロールにアクセスするにはどうすればよいですか?DataTemplateからコントロールにプログラムでアクセスする

ConverterParameterが設計時にわからないバインディングを追加する必要があり、ConverterParametersへのバインディングがサポートされていないため、コードでバインディングを作成する必要があります。理想的には、私はこれをDataTemplate内のコントロールの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

これを少し拡張して、これが役に立つシナリオを含めることができますか? –

+0

質問に追加... –

答えて

1

あなたはそれを処理するためにあなたのDataTemplateで別のコントロールを持つことができるが、それはしても、一種の厄介です「論理がそれを正当化すると本当に信じていない限り」の警告。

あなたのアプローチを考え直すことをお勧めします。私の意見では(それはちょうど意見です!)、コード内で唯一のバインドをする必要がありますエキゾチック状況。

IValueConverterを使用する代わりに、(あなたのItemsSourceがViewModelsのコレクションであると仮定して)ViewModelのプロパティにバインドし、それに応じてVMに値を変換させます。このコントロールのデフォルトのスタイルをジェネリックで醜いものにし、特定のプロパティにバインドする必要がある場合には、特定のスタイルを使用することもできます。

関連する問題