2013-05-27 72 views
2

我有一個創建的經由反射綁定作爲一個DataContext到TabControl並且被表示爲其中內容被綁定爲創建的控制,其通過使用反射完成ContentPresenter控件控制列表的窗口。有人可以解釋我這種WPF事件的奇怪行爲嗎?

<TabControl.ContentTemplate> 
    <DataTemplate> 
     <ContentPresenter Content="{Binding sub}" Loaded="smb_Loaded"> 
     </ContentPresenter> 
    </DataTemplate> 
</TabControl.ContentTemplate> 

創作,我需要一些東西做給創建的控件(他們中的每單一個)像subcribing到他們的活動或乳寧某些方法或線程之後,所以我想有它後,正在做初始化或創建對象。我試圖在「初始化」或「加載」事件之後完成這些工作,但是隻有在第一次加載時纔會觸發它們。 如果我用反射創建3個控件,我將有3個標籤,其內容爲ContentPresenters,其中包含控件。當我選擇一個標籤時,該事件將被觸發。如果我然後選擇另一個,它將不會被觸發,直到我重新運行該應用程序。

+0

能否請你重新整理這部分:*的東西要做,以創建控件(他們中的每個人)*?這很難理解。 – DHN

+1

選項卡控件有點特殊項目控制 - 它顯示項目列表(選項卡項目),但只有一個內容演示者顯示每個項目的內容。您可能想要聽取選項卡控件上的SelectionChanged。 – XAMeLi

+0

創建這些控件後,我將控件設置爲內​​容展示器中的內容,如上面的代碼中所示。在創建和插入表單之後,我需要了解這些動態創建的控件的幾個事件以及一些初始化的東西。我需要一個事件在創建後觸發,但「Isinitialized」事件僅在第一個控件上觸發。從來沒有在別人身上。 – user853710

回答

0

你可以聽在項目收集的變化:當控制被加載,你應該註冊SelectionChanged事件

CollectionViewSource.GetDefaultView(tab.Items).CollectionChanged += (o, ev) => 
{ 
    Console.WriteLine("item added"); 
}; 
0

Initializationloaded事件只運行一次。

<TabControl SelectionChanged="TabControl_SelectionChanged"> 
    <TabControl.ContentTemplate> 
    <DataTemplate> 
     <ContentPresenter Content="{Binding sub}" Loaded="smb_Loaded"> 
     </ContentPresenter> 
    </DataTemplate> 
    </TabControl.ContentTemplate> 
</TabControl> 

背後

private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    // do all your logic here 
    // subscribe to events 
} 

代碼不要忘記previosly註冊的事件未選擇項目的註銷。

如果SelectionChanged事件不能滿足您的需求登記您的活動,當你動態創建你的控制,你將有權發佈相關的代碼...

+0

Selectionchanged對我絕對沒有用處。註冊觸發初始化事件處理程序時需要完成的事件,但只觸發一個tabitem。而不是其他人。這是奇怪的行爲。 selectionchanged事件與本故事相關,只是在第一次選擇它時觸發加載或初始化的事件處理程序。據代碼我粘貼它應該觸發每一個的TabItem的負荷,但只在一個引發他們 - – user853710

+0

@ user853710有什麼奇怪關於它的標籤控件本身被加載一次,這就是爲什麼你contentPresenter被觸發僅一旦。你必須張貼相關的登記代碼,因爲它不清楚你真正要做的並沒有 – makc

+0

是否有可能有它調用的方法正在創建的對象後,我可以手動設置事件的訂閱? 我需要設置一些東西,用戶選擇一個選項卡 – user853710

相關問題