我们正在尝试对System.Windows.Controls.ComboBox进行子类化,以实现一些自定义编辑行为。
为此,我们需要EditableTextBox。
类定义:
public class CustomComboBox : System.Windows.Controls.ComboBox
在OnLoaded()处理程序中,尝试找到该部分失败:
private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
{
var cb = sender as System.Windows.Controls.ComboBox;
Debug.Assert(cb != null);
var textBox = cb.Template.FindName("PART_EditableTextBox", cb);
Debug.Assert(textBox != null, "How is this possible -- TextBox not found?");
在调用FindName()之后,'textBox'为null。
在调试器中,我在cb.Template.ChildNames中找到名称“ PART_EditableTextBox”。
我们怎么了?
谢谢-
答案 0 :(得分:1)
如果要在派生类中检索控件的一部分,则应使用GetTemplateChild方法。使用此方法的正确位置是在调用基本方法后,在OnApplyTemplate覆盖自定义控件的地方。
您可以找到一个示例here(请参见“ 预计缺少FrameworkElement对象”部分)或here。
此外,您的自定义ComboBox
必须将其属性IsEditable
设置为true
(否则它将使用不包含该部分的模板,您可以查看ComboBox
默认使用ILSpy)。
<local:CustomComboBox IsEditable="True">
因此您的代码应为:
public class CustomComboBox : ComboBox
{
private TextBox editableTextBox;
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
if (IsEditable)
{
editableTextBox = GetTemplateChild("PART_EditableTextBox") as TextBox;
}
}
}
希望它能对您有所帮助。