2
我想在用戶設置依賴屬性後,按名稱綁定到DataTemplate內的HyperlinkButton。 (所有的代碼都在Silverlight 4中)不幸的是,直到運行時才知道要綁定的字段。我知道我可以在運行時創建DataTemplate作爲具有正確綁定路徑的字符串,並將它作爲XmlReader注入,但這會讓人覺得不舒服。我繼續從FindVisualChild函數中得到的錯誤是「引用不是有效的可視化DependencyObject」。如何從數據模板中獲取對HyperlinkButton的引用,以便設置綁定?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;
}
}
你嘗試一個更簡單的辦法 - 像NavigateUri元素結合使用雙向綁定的屬性? – 2011-06-09 13:40:21
我會給它一個鏡頭。感謝這個想法。我確實找到了我的問題的答案,它實際上是在我的代碼中,但由於缺乏重點,我無法將我的答案發布另外7個小時。等等。簡短的回答是'var hyperlinkButton = context.CellTemplate.LoadContent()as HyperlinkButton;' – hewstone 2011-06-09 13:55:21
Jason - 我試過了,我無法讓它工作。我猜測單元格的datacontext與行的datacontext不一樣。你有沒有可以開始工作的例子? – hewstone 2011-06-09 15:09:05