2011-01-29 16 views
0

TabItemスタイル内にはボタンがあります。そのボタンには(親)TabItemを送るコマンドがあります。 SilverlightにはRelativeSourceはありません。しかし、単にElementnameを使うことはできません。私のTabItemはスタイル内に名前がないからです。Silverlight 4:ChildControlをParentControlにバインドする

<Style TargetType="sdk:TabItem"> 
         <Setter Property="HeaderTemplate"> 
          <Setter.Value> 
           <DataTemplate>         
            <StackPanel Orientation="Horizontal">           
             <TextBlock Text="{Binding TabCaption}"/> 
             <Button Margin="8,0,0,0" 
               Command="local:Commands.CloseTabItem" 
               CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type sdk:TabItem}}}" 
               HorizontalContentAlignment="Center" 
               VerticalContentAlignment="Center">            
             </Button> 
            </StackPanel> 
           </DataTemplate> 
          </Setter.Value> 
         </Setter> 
        </Style> 

これは、コマンドのメソッド内のコードのようになります。

private void OnCloseTabItemExecute(object sender, ExecutedRoutedEventArgs e) 
{ 
    TabItem parent = e.Parameter as TabItem; 

    if (parent != null) 
    { 
     FrameworkElement view = (parent as TabItem).Content as FrameworkElement; 
     string regionName = RegionManager.GetRegionName(view); 

     _regionManager.Regions[regionName].Remove(view); 
    } 
} 

は、どのように私はSilverlightの4内の子コントロールのコマンドパラメータとして、親コントロール(のTabItem)に渡すことができますか?

非常に高く評価されています。

答えて

1

あなたは

<Button Margin="8,0,0,0" 
     Command="local:Commands.CloseTabItem" 
     CommandParameter="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}}"  
     HorizontalContentAlignment="Center" 
     VerticalContentAlignment="Center"> 
</Button> 

コマンド方式と実装TabItem

XAMLを見つけるために、バインディングにRelativeSourceモードSelfまたはTemplatedParentを使用して、コマンド方式でビジュアルツリーを歩くことができますGetVisualParentの

private void OnCloseTabItemExecute(object sender, ExecutedRoutedEventArgs e) 
{ 
    DependencyObject element = e.Parameter as DependencyObject; 
    TabItem tabItem = GetVisualParent<TabItem>(element); 
    //... 
} 
public static T GetVisualParent<T>(object childObject) where T : FrameworkElement 
{ 
    DependencyObject child = childObject as DependencyObject; 
    while ((child != null) && !(child is T)) 
    { 
     child = VisualTreeHelper.GetParent(child); 
    } 
    return child as T; 
} 
0

{RelativeSource Self}を使用すると、コマンドハンドラのコードでParentプロパティを使用して、必要なコントロールを上向きに表示できます。

+0

あなたのヒントをありがとう。コマンドのメソッドの最後にButtonオブジェクトを正常に取得しています。ただし、Parentプロパティは、上のStackPanelを示します。私はまだ掘削することができますか?私は別の親と一緒にこれをやってみましたが、それは私にはできませんでした。ありがとうございました – Houman

関連する問題