ContentPresenter Inherited DataContext

时间:2014-11-14 14:09:23

标签: c# wpf xaml

我创建了一个继承自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。

1 个答案:

答案 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。您在模板中使用DataContextBinding