2011-01-03 7 views
4

グリッドを含み、グリッド内にコンボボックスがあるデータテンプレートがあります。WPF DataTemplateからコントロールにアクセスする方法

<DataTemplate x:Key="ShowAsExpanded"> 
     <Grid>     
      <ComboBox Name ="myCombo" Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Top" Margin="5" 
         IsSynchronizedWithCurrentItem="True" 
         ItemsSource="{Binding}" 
         ItemTemplate="{StaticResource MyItems}"> 
       <ComboBox.ItemsPanel> 
        <ItemsPanelTemplate> 
         <VirtualizingStackPanel /> 
        </ItemsPanelTemplate> 
       </ComboBox.ItemsPanel> 
      </ComboBox> 

     </Grid> 
    </DataTemplate> 

私は、スタイリングを通してそのテンプレートを参照するグリッドを持っています。

<Grid> 
    <ContentPresenter Name="_contentPresenter" Style="{DynamicResource StyleWithCollapse}" Content="{Binding}" /> 
</Grid> 

基本的にDataContextを設定するためにmyComboを使用してコードをアクセスするにはどうすればよいですか?

答えて

4

まず、Resource(ShowAsExpanded)とContentPresenter内の使用法の関係を見つけることさえできません。しかし、DynamicResourceがShowAsExpandedを指していると仮定します。

コードでコンボボックスにアクセスすることはできません。スタイルを使用するグリッドにdatacontextをバインドする必要があります。それをしたくない場合は、実行時にコンテンツを見つけて、子コンボボックスを検索する必要があります。

+0

インテリア。私はかなり新しいwpfです。グリッド上にdatacontextを設定すると、これはテンプレートのコンボボックスにどのように伝播しますか?また、テンプレートに2つのコンボボックスがある場合、各コンボのdatacontextは、それぞれが異なるdatacontextを持つ場合、どのようにバインドされるとしますか? – pdiddy

+2

datacontextは、その子のdatacontextを明示的に設定しない限り、子に伝播されます。したがって、グリッド上にdatacontextを設定すると、ContentPresenter(および以下のすべてのコントロール)はそのdatacontextを共有し、バインドできます。 –

+0

2つの異なるコレクションにバインドする必要があるテンプレートに2つのコンボボックスがある場合、どうすればよいでしょうか? – pdiddy

18

私が知っている3つの方法。

1.Use FindName指定

ComboBox myCombo = 
    _contentPresenter.ContentTemplate.FindName("myCombo", 
               _contentPresenter) as ComboBox; 

2.Addビジュアルツリーであっ

<ComboBox Name ="myCombo" Loaded="myCombo_Loaded" ... 

private void myCombo_Loaded(object sender, RoutedEventArgs e) 
{ 
    ComboBox myCombo = sender as ComboBox; 
    // Do things.. 
} 

3.FindそれからのコンボボックスとアクセスそれにLoadedイベント

private void SomeMethod() 
{ 
    ComboBox myCombo = GetVisualChild<ComboBox>(_contentPresenter); 
} 
private T GetVisualChild<T>(DependencyObject parent) where T : Visual 
{ 
    T child = default(T); 
    int numVisuals = VisualTreeHelper.GetChildrenCount(parent); 
    for (int i = 0; i < numVisuals; i++) 
    { 
     Visual v = (Visual)VisualTreeHelper.GetChild(parent, i); 
     child = v as T; 
     if (child == null) 
     { 
      child = GetVisualChild<T>(v); 
     } 
     if (child != null) 
     { 
      break; 
     } 
    } 
    return child; 
} 
+0

ありがとう、非常に役に立ちましたが、Geert van Horrikの答えは、コードを介してアクセスすることが正しい方法ではないと思っています。 – pdiddy

+0

@pdiddy:あなたは絶対に正しいです:)幸運 –

関連する問題