2013-05-27 44 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

相关问题