2011-05-26 38 views
3

如果我有以下XAML: 從DataTemplate中按名稱獲取對象引用

<toolkit:DataForm Height="100" x:Name="form"> 
     <toolkit:DataForm.EditTemplate> 
      <DataTemplate> 
       <StackPanel Name="stack"></StackPanel> 
      </DataTemplate> 
     </toolkit:DataForm.EditTemplate> 
    </toolkit:DataForm>
我可以通過this.FindName(「form」)從View獲取對「form」的引用。

如何獲得對「堆棧」的引用? FindName返回null。

回答

4

這裏的問題是DataTemplate的xaml內容屬於與外部Xaml不同的NameScope。在元素上調用FindName只會搜索元素最初生成的NameScope。因此在UserControl上調用FindName將找不到由DataTemplate生成的元素。這是因爲DataTemplate(和其他模板)被設計爲多次重複使用,使用NameScope可以消除名稱的歧義。

解決的方法是調用VisualTreeHelper的幫助,看看這個blog中的代碼,我的代碼是VisualTreeHelper。如果你知道「堆棧」是一個StackPanel那麼你可以更具體地指定.OfType<T>

var element = this.Descendents().OfType<FrameworkElement>().FirstOrDefault(fe => fe.Name == "stack"); 

當然 - :隨着從博客中VisualTreeEnumeration類添加到您的項目,你可以做到這一點。