我已經創建了一個自定義控件,該控件從DataGrid繼承,並以HeaderedContentControl具有標頭的相同方式添加標題屬性。ContentPresenter繼承DataContext
[Bindable(true)]
public Object Header
{
get { return (Object)GetValue(HeaderProperty); }
set { SetValue(HeaderProperty, value); }
}
// Using a DependencyProperty as the backing store for Header. This enables animation, styling, binding, etc...
public static readonly DependencyProperty HeaderProperty =
DependencyProperty.Register("Header", typeof(Object), typeof(ExtendedDataGrid), new PropertyMetadata(null, HeaderProperty_Changed));
private static void HeaderProperty_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
ExtendedDataGrid ctrl = (ExtendedDataGrid)d;
ctrl.OnHeaderChanged(e.OldValue, e.NewValue);
}
protected virtual void OnHeaderChanged(object oldValue, object newValue)
{
RemoveLogicalChild(oldValue);
AddLogicalChild(newValue);
}
控件模板將ContentPresenter內容綁定到HeaderProperty。 (這是內部的ScrollViewer的ControlTemplate數據網格的ControlTemplate內,所以我不能使用ContentSource)
<ContentPresenter Grid.Row="0" Grid.ColumnSpan="99"
Margin="0"
Content="{Binding Header, RelativeSource={RelativeSource AncestorType{x:Type extended:ExtendedDataGrid}}}"/>
的內容被正確地設置到頭部屬性。
我發現內容展示器不會繼承DataGrid DataContext,所以我必須單獨設置DataContext。這意味着頭中的任何綁定都不會按預期進行綁定,因爲頭中所有元素的DataContext都爲null。我可以從ContentPresenter實現中看到它在Initialise上專門將DataContext設置爲null,所以我明白爲什麼會發生這種情況。
問題
但是部分我不明白,我想知道的是如何在衆多其他控件ContentPresenter元素都能正常繼承,而不在DataContext(從我所看到的)任何不同的代碼/ XAML ?例如Button ContentPresenter或HeaderContentControl ContentPresenter。
在控制模板中,您必須使用'TemplateBinding'。 – Sinatr 2014-11-14 14:14:06
請解釋這將如何幫助我。正如我所說的ContentPresenter是在ScrollViewer ControlTemplate中,所以TemplateBinding會給我不正確的結果。 – ndonohoe 2014-11-14 15:06:29
'Button's'ContentPresenter'正在使用'TemplateBinding'(100%肯定)。我試圖理解你可能會問(如果它不是一個綁定問題),只是不明白;)'DataContext'?它可以設置爲yes,它由'Button'繼承,但它不在'Button'控件模板中使用。所以再一次,你的問題是什麼? – Sinatr 2014-11-14 15:26:00