我创建了一个继承自DataGrid的自定义控件,并添加了一个标题属性,其方式与HeaderedContentControl具有标题的方式相同。
[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。 (这是在DataGrid ControlTemplate里面的Scrollviewer 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 ContentPresenters。
答案 0 :(得分:0)
[anwer,因为我不知道我在回答什么问题;)
以下是ContentPresenter
Button
控件模板(您看到的内容here只是某些可能的模板的示例)
<ContentPresenter RecognizesAccessKey="True"
Content="{TemplateBinding ContentControl.Content}"
ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" Margin="{TemplateBinding Control.Padding}" HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
如您所见,它使用TemplateBinding
。模板中没有DataContext
。您不在模板中使用DataContext
和Binding
。