我已经创建了一个自定义控件,该控件继承自DataGrid,并以与HeaderedContentControl具有标头相同的方式添加header属性。
[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)
<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。
发布于 2014-11-14 16:33:23
有点简单,因为我不知道我在回答什么问题;)
下面是ContentPresenter of Button控件模板(您看到的这里只是一些可能的模板的示例)
<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。
https://stackoverflow.com/questions/26931880
复制相似问题