首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ContentPresenter遗传DataContext

ContentPresenter遗传DataContext
EN

Stack Overflow用户
提问于 2014-11-14 14:09:23
回答 1查看 1.9K关注 0票数 1

我已经创建了一个自定义控件,该控件继承自DataGrid,并以与HeaderedContentControl具有标头相同的方式添加header属性。

代码语言:javascript
复制
[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。(这是在滚动器ControlTemplate中,在DataGrid ControlTemplate中,所以我不能使用ContentSource)

代码语言:javascript
复制
<ContentPresenter Grid.Row="0" Grid.ColumnSpan="99"
                    Margin="0"
                    Content="{Binding Header, RelativeSource={RelativeSource AncestorType{x:Type extended:ExtendedDataGrid}}}"/>

内容被正确地设置为header属性。

我发现内容演示者没有继承DataGrid DataContext,所以我必须单独设置DataContext。这意味着标题中的任何绑定都不会像预期的那样绑定,因为标头中所有元素的DataContext都是空的。我从ContentPresenter实现中可以看出,它在初始化时专门将DataContext设置为null,因此我理解为什么会发生这种情况。

问题

但是,我不理解(我想知道)的部分是,许多其他控件中的ContentPresenter元素是如何正确地继承DataContext的,而没有(从我所看到的)任何不同的代码/xaml?例如,按钮ContentPresenter或HeaderContentControl ContentPresenters。

EN

回答 1

Stack Overflow用户

发布于 2014-11-14 16:33:23

有点简单,因为我不知道我在回答什么问题;)

下面是ContentPresenter of Button控件模板(您看到的这里只是一些可能的模板的示例)

代码语言:javascript
复制
    <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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26931880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档