2015-05-26 11 views
0

Я использую DataTemplate, где я объявил два Buttons, и они по умолчанию невидимы. Теперь я хочу сделать их Visible в коде, основанном на каком-то определенном состоянии, но я не могу найти эти элементы управления.Невозможно найти элементы управления внутри DataTemplate в SilverLight5

Ниже мой код:

XAML:

<ItemsControl x:Name="SynonymsItemsControl" ItemsSource="{Binding Synonyms}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Orientation="Horizontal" Margin="0,5,0,0" /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel x:Name="SynonymsStackPanel"> 
       <CheckBox x:Name="SynonymsChkBx" Content="{Binding Display}" Margin="10,0,0,0" /> 

       WANT TO FIND THESE TWO BUTTONS 
       <Button x:Name="AddSynonymsBtn" Margin="525, 0, 0, 0" ToolTipService.ToolTip="Add Synonyms" Visibility="Collapsed"> 
        <Image Source="/Images/AddSynonyms.png" Height="24"/> 
       </Button> 
       <Button x:Name="CancelSynonymsBtn" Margin="600, 0, 0, 0" ToolTipService.ToolTip="Cancel Synonyms" Visibility="Collapsed"> 
        <Image Source="/Images/CancelSynonyms.png" Height="24"/> 
       </Button> 

      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

КОД-ЗА:

Я смог найти ItemControl, делая это,

System.Windows.Controls.ItemsControl itemControl = (from sp in selectedTreeViewItem.GetVisualDescendants().OfType<System.Windows.Controls.ItemsControl>() 
                where sp.Name == "SynonymsItemsControl" 
                select sp).FirstOrDefault(); 

Когда Я хочу найти кнопки, которые объявлены внутри этого ItemsControl ->DataTemplate, речь идет, как Null

Button AddSynonymsBtn = (from btn in itemControl.GetVisualDescendants().OfType<Button>() 
         where btn.Name == "AddSynonymsBtn" 
         select btn).FirstOrDefault(); 

Так мне интересно, что мне нужно сделать, чтобы найти ItemsControl вообще? если да, то почему я не могу найти эти кнопки?

Я также пробовал var findControl = temControl.ItemContainerGenerator.ContainerFromIndex(index); но такой же результат (Null).

ответ

0

Вы можете получить Исли управления из-за помощью Template.FindName(string Name);

private Button _partSynonyms = null; 

public MyControlTemplate{ 
    Loaded += (sender, e) => OnLoaded(); 
} 

private void OnLoaded(){ 
    _partSynonyms = (Button)Template.FindName("PART_AddSynonymsBtn"); //You "should" use PART_ as a prefix in a Template 
    if(_partSynonyms == null) 
    //Button not found -> Log some error but you should not throw an exception 
}