2

我有一个窗口,它通过反射创建控件列表,这些控件作为数据上下文绑定到 aTabControl并表示为ContentPresenter控件,其中内容绑定为创建的控件,这是通过使用反射完成的。

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

在创建之后,我需要对创建的控件(其中的每一个)做一些事情,比如订阅它们的事件或运行一些方法或线程,所以我希望在初始化或创建对象之后完成它。我试图在“初始化”或“加载”事件之后完成这些事情,但它们都只在第一次被触发,只有在我加载的第一个控件上。如果我用反射创建 3 个控件,我将有 3 个选项卡,其内容是ContentPresenters包含该控件的。当我选择一个选项卡时,将触发该事件。如果我随后选择另一个,则在我重新运行应用程序之前根本不会触发它。

4

2 回答 2

0

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

 CollectionViewSource.GetDefaultView(tab.Items).CollectionChanged += (o, ev) =>
 {
    Console.WriteLine("item added");
 };
于 2013-05-27T15:13:50.380 回答
0

Initialization并且loaded事件仅在加载控件时运行一次,您应该注册到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事件不能满足您的需求,请在动态创建控件时注册您的事件,您将不得不发布相关代码...

于 2013-05-27T15:22:01.497 回答