谁能解释一下这个WPF事件的奇怪行为?

时间:2013-05-27 08:21:49

标签: c# wpf events

我有一个窗口,通过反射创建一个控件列表,这些控件作为datacontext绑定到TabControl并表示为ContentPresenter控件,其中内容被绑定为创建的控件,是通过使用反射完成的。

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

创建之后,我需要对创建的控件(每一个控件)进行一些操作,例如订阅它们的事件或运行一些方法或线程,所以我想在初始化或创建之后完成它。物体。我尝试在“Initialized”或“Loaded”事件之后完成这些操作,但是只有第一次触发它们,仅在我加载的第一个控件上。 如果我使用反射创建3个控件,我将有3个包含控件的内容为ContentPresenters的选项卡。当我选择一个选项卡时,将触发该事件。如果我再选择另一个,则在重新运行应用程序之前根本不会触发它。

2 个答案:

答案 0 :(得分:0)

您可以收听Items集合中的更改:

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

答案 1 :(得分:0)

Initializationloaded事件仅在加载控件时运行一次,您应该注册到SelectionChanged事件。

<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
}

不要忘记取消注册未选择项目的预先注册事件。

如果SelectionChanged事件不能满足您的需求,请在动态创建控件时注册您的活动,您必须发布相关代码......