2011-06-09 61 views
2

我想在用戶設置依賴屬性後,按名稱綁定到DataTemplate內的HyperlinkBut​​ton。 (所有的代碼都在Silverlight 4中)不幸的是,直到運行時才知道要綁定的字段。我知道我可以在運行時創建DataTemplate作爲具有正確綁定路徑的字符串,並將它作爲XmlReader注入,但這會讓人覺得不舒服。我繼續從FindVisualChild函數中得到的錯誤是「引用不是有效的可視化DependencyObject」。如何從數據模板中獲取對HyperlinkBut​​ton的引用,以便設置綁定?Silverlight:按名稱在DataTemplate中獲取元素

這裏是我的代碼,我有工作:

XAML:

<sdk:DataGridTemplateColumn x:Class="CHK.WebMap.SL.Controls.DataGridURLTemplateColumn" 
    xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    d:DesignHeight="300" d:DesignWidth="400"> 
    <sdk:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <HyperlinkButton x:Name="btnHyperlink" TargetName="_blank" /> 
     </DataTemplate> 
    </sdk:DataGridTemplateColumn.CellTemplate> 
</sdk:DataGridTemplateColumn> 

代碼隱藏:

public partial class DataGridURLTemplateColumn : DataGridTemplateColumn 
{ 
    public string NavigateUri 
    { 
     get { return (string)GetValue(NavigateUriProperty); } 
     set { SetValue(NavigateUriProperty, value); } 
    } 
    public static readonly DependencyProperty NavigateUriProperty = 
     DependencyProperty.Register("NavigateUri", typeof(string), typeof(DataGridURLTemplateColumn), new PropertyMetadata((s, e) => 
     { 
      var context = s as DataGridURLTemplateColumn; 
      context.CellTemplate.LoadContent(); //create the ui elements 

      var hyperlinkButton = context.FindVisualChild<HyperlinkButton>(context) as HyperlinkButton; 
      hyperlinkButton.SetBinding(HyperlinkButton.NavigateUriProperty, new Binding(e.NewValue as string)); 
      hyperlinkButton.SetBinding(HyperlinkButton.ContentProperty, new Binding(e.NewValue as string)); 
     })); 

    public DataGridURLTemplateColumn() 
    { 
     InitializeComponent(); 
    } 


    private childItem FindVisualChild<childItem>(DependencyObject obj) where childItem : DependencyObject 
    { 

     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) 
     { 

      DependencyObject child = VisualTreeHelper.GetChild(obj, i); 

      if (child != null && child is childItem) 
       return (childItem)child; 
      else 
      { 
       childItem childOfChild = FindVisualChild<childItem>(child); 
       if (childOfChild != null) 
        return childOfChild; 
      } 
     } 

     return null; 
    } 
} 
+1

你嘗試一個更簡單的辦法 - 像NavigateUri元素結合使用雙向綁定的屬性? – 2011-06-09 13:40:21

+0

我會給它一個鏡頭。感謝這個想法。我確實找到了我的問題的答案,它實際上是在我的代碼中,但由於缺乏重點,我無法將我的答案發布另外7個小時。等等。簡短的回答是'var hyperlinkBut​​ton = context.CellTemplate.LoadContent()as HyperlinkBut​​ton;' – hewstone 2011-06-09 13:55:21

+0

Jason - 我試過了,我無法讓它工作。我猜測單元格的datacontext與行的datacontext不一樣。你有沒有可以開始工作的例子? – hewstone 2011-06-09 15:09:05

回答

5

好吧,我想出了答案。我的問題是如何獲取DataTemplate中的元素。我確實在代碼示例中使用了它,但沒有將結果保存到變量中。

var hyperlinkButton = context.CellTemplate.LoadContent() as HyperlinkButton;