2016-02-02 84 views
0

我創建了一個FilteredComboBox,它來源於標準的WPF comboBox。這個新的UserControl到目前爲止在其設計的原始測試應用程序中工作良好。 現在,我已經複製類到試圖訪問PART_EditableTextBox孩子ComboBox的時候我得到空引用例外我的主要應用:GetTemplateChild在不同的項目中返回null

public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 
     EditableTextBox.SelectionChanged += EditableTextBox_SelectionChanged; 
     ItemsPopup.Focusable = true; 
    } 

    private TextBox EditableTextBox 
    { 
     get { return (TextBox)GetTemplateChild("PART_EditableTextBox"); } 
    } 

在我想要的線路出現問題添加一個SelectionChanged事件。如果做一些研製它總是建議等到ApplyTemplate完成它基本上在base.OnApplyTemplate();

做我查了基礎模板在我的主要應用程序,它應該包含PART_EditableTextBox

任何想法可能是錯誤的地方或我可以做什麼進一步調查?

更新:我檢查了一些澤維爾的建議後發現問題。與PART_EditableTextBox的問題是,它是當ComboBox被定義爲

IsEditable = True 

這我必須承認並沒有在我提到的第二個項目的情況下才有效。如果ComboBox不可編輯,那麼它根本不具有EditableTextBox: -/

感謝您的支持傢伙...

+0

該代碼看起來不錯。只是瘋狂的猜測,也許'PART_EditableTextBox'是變量名,所以正確的代碼應該是'GetTemplateChild(PART_EditableTextBox);' – kennyzx

回答

0

您應該確認您得到您所期望的模板。如果您確定該模板具有您想要的指定部分,但嘗試檢索該部分則返回null,那麼當您試圖訪問它時幾乎肯定不會將其應用於該控件。

您提到,當您將控件從一個組件移到另一個時,問題就開始了。也許你移動它的程序集沒有正確地設置你正在嘗試做的事情。

例如,您是否期待模板作爲默認主題的一部分自動應用?如果是這樣,程序集中正確位置的樣式(在themes/generic.xaml中還是從其引用),並且您是否正確定義AssemblyInfo.cs文件中的ThemeInfo attribute? (另外,您是否覆蓋用戶控件中的元數據以使用正確的資源密鑰?)

如果您是在某處顯式應用模板,那麼基礎類的默認值可能會在您的應用之前得到應用,所以您在應用默認設置時會崩潰,並且永遠不會到達您應用的位置。

有幾件事情可能是錯誤的,並且很難知道它是什麼,而沒有簡單地檢查一切。希望我說過的話會給你一個關於這個問題的暗示。


注意:作爲慣例,我總是在嘗試檢索模板部件後添加空檢查。您永遠無法確定如何使用控件,以及可能在不同場景中應用的模板。例如,使用該控件的任何人都可以覆蓋該模板,而不指定您期望的部分。在我看來,最好是讓控件的功能不如設計的那麼好,否則會導致應用程序崩潰。注意2:你不應該在每次你想訪問它時都有一個查找模板部分的屬性,你應該在OnApplyTemplate中查找一次,並將它存儲爲一個成員變量。每次從代碼訪問控件時都可以保存模板查找。

0

你有沒有考慮過使用這個自定義控件與UserControl?我認爲你遇到的問題可能是由於UserControl在對象生命週期中被初始化的時間。

在下面的情況下,您正試圖在部件可訪問之前連接事件處理程序。

解決此類問題的一種方法是使用Dispatcher等待其安全事件來處理事件處理程序。

public override void OnApplyTemplate() 
{ 
    base.OnApplyTemplate(); 
    GetTemplateParts(); 
    ItemsPopup.Focusable = true; 
} 

protected void GetTemplateParts() 
{ 
     Dispatcher.CurrentDispatcher.BeginInvoke(
      DispatcherPriority.Loaded, 
      new Action(() => 
      { 
       EditableTextBox.SelectionChanged += EditableTextBox_SelectionChanged; 
      })); 
} 
相關問題