我有一个自定义控件。 ControlTemplate
位于Generic.xaml文件中。控件的类包含OnApplyTemplate
方法的替代。
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
var textBox = Template.FindName("PART_textBox", this) as TextBox;
if (textBox != null)
{
textBox.GotFocus += PART_textBox_GotFocus;
textBox.LostFocus += PART_textBox_LostFocus;
}
var grid = Template.FindName("PART_grid", this) as Grid;
if (grid != null)
{
grid.DataContext = this;
}
}
我的控件模板中的根元素是Grid
。我想设置根元素的数据上下文。我重写OnApplyTemplate
以便能够将事件附加到模板中的控件,并设置网格的数据上下文。
在视图中使用我的自定义控件时出现问题。在控件初始化期间,绑定错误会显示在控制台中。自定义控件的模板中的控件与数据上下文的所有绑定第一次都会失败,因为尚未设置数据上下文。一旦在自定义控件中调用OnApplyTemplate
(仍在谈论“初始化”),就设置了数据上下文,并且一切正常。这不是一个明显的问题,用户根本不会注意到这一点。但是错误显示在控制台中,这意味着我做错了。在自定义控件的构造函数中设置DataContext将无济于事,因为在此阶段未设置(内置)Template
属性。
我正在将Grid的datacontext设置为自定义控件本身的类,不建议这样做,但这不会改变问题的原因。
您可以使用{RelativeSource TemplatedParent}
或{RelativeSource AncestorType=local:YourControl}
绑定到XAML中控件本身的属性。
您不应该在DataContext
中设置控件的OnApplyTemplate()
。这将防止您的控件像您希望作为控件的使用者那样从元素树的父级继承DataContext
。