我認爲你可以使用this
使用此代碼,你可以找到的DataGridColumn的祖先 - 你的視覺樹DataGrid中。此代碼實現靜態函數,但是你可以用更多的「會說話」的名字一樣FindAncestor它更改爲擴展方法:
public static class UIElementExtensions
{
public static T FindAncestor<T>(this UIElement control) where T: UIElement
{
UIElement p = VisualTreeHelper.GetParent(control) as UIElement;
if (p != null)
{
if (p is T)
return p as T;
else
return p.FindAncestor<T>();
}
return null;
}
}
,並使用它:如果你需要從XAML您的DataGrid
DataGrid p = dataGridColumn.FindAncestor<DataGrid>();
嘗試使用來自this article的綁定。
祝你好運。
UPDATE:
我明白是怎麼一回事。下一個答案不會那麼容易,但它是silverlight :) 那麼,爲什麼你不能使用VisualTreeHelper從DataGridColumn中找到DataGrid?因爲DataGridColumn在Visual Tree中不存在。 DataGridColumn繼承自DependencyObject,而不是UIElement。 忘掉VisualTree,新的想法會是這樣的:我們添加附加屬性到DataGridColumn - 名爲Owner,並綁定DataGrid到這個屬性。 但是,DataGridColumn是DependencyObject和ElementName的任何綁定在silverlight 4中都不起作用。 我們只能綁定到StaticResource。所以,做到這一點。 1)所有者附加屬性的DataGridColumn:
public class DataGridHelper
{
public static readonly DependencyProperty OwnerProperty = DependencyProperty.RegisterAttached(
"Owner",
typeof(DataGrid),
typeof(DataGridHelper),
null));
public static void SetOwner(DependencyObject obj, DataGrid tabStop)
{
obj.SetValue(OwnerProperty, tabStop);
}
public static DataGrid GetOwner(DependencyObject obj)
{
return (DataGrid)obj.GetValue(OwnerProperty);
}
}
2)數據網格的Xaml(例如):
<Controls:DataGrid x:Name="dg" ItemsSource="{Binding}">
<Controls:DataGrid.Columns>
<Controls:DataGridTextColumn h:DataGridHelper.Owner="[BINDING]"/>
</Controls:DataGrid.Columns>
</Controls:DataGrid>
3)數據網格容器 - 在StaticResource的DataGrid實例的門將:
public class DataGridContainer : DependencyObject
{
public static readonly DependencyProperty ItemProperty =
DependencyProperty.Register(
"Item", typeof(DataGrid),
typeof(DataGridContainer), null
);
public DataGrid Item
{
get { return (DataGrid)GetValue(ItemProperty); }
set { SetValue(ItemProperty, value); }
}
}
4)添加到DataGridContainer的視圖實例的資源並將DataGrid實例綁定到Item屬性:
<c:DataGridContainer x:Key="ownerContainer" Item="{Binding ElementName=dg}"/>
在這裏,ElementName的綁定將起作用。
5)最後一步,我們結合我們的DataGrid附財產所有者(見第2頁和下面的代碼添加到[裝訂]部分):
{Binding Source={StaticResource ownerContainer}, Path=Item}
這就是全部。在代碼中,如果我們參考的DataGridColumn我們可以得到所有的數據網格:
DataGrid owner = (DataGrid)dataGridColumn.GetValue(DataGridHelper.OwnerProperty);**
希望這個原則會幫助你。
我想到了這一點,但當我嘗試獲取DataGridColumn的父項時,「VisualTreeHelper.GetParent」會引發異常。 – Jordan 2011-03-11 15:45:17
您在第2步中的「[綁定]」是什麼意思?您的意思是「{綁定}」?如果是這樣,那不會有幫助。 – Jordan 2011-03-16 13:26:55
請參閱第5步。我希望您應該在此處添加 – 2011-03-16 13:44:33