【问题标题】:WPF DataTemplate - Event fired when a new item is added to Collection?WPF DataTemplate - 将新项目添加到集合时触发的事件?
【发布时间】:2010-11-09 14:16:27
【问题描述】:

当一个新项目被添加到Flights 集合时,一个新的TabItem 被添加到TabControl。添加新选项卡时,我需要调用 Chart 控件上的方法。问题是我无法确定要处理的正确事件。

我的 XAML 如下所示:

<TabControl Name="chartControl" ItemsSource="{Binding Flights}">
    <TabControl.ItemContainerStyle>
        <Style TargetType="TabItem">
            <Setter Property="Header" Value="{Binding Name}" />
        </Style>
    </TabControl.ItemContainerStyle>
    <TabControl.ContentTemplate>
        <DataTemplate>
            <WindowsFormHost Name="winHost">
                <legacy:Chart></legacy:Chart>
            </WindowsFormHost>
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>
  • 我尝试在TabControl 上处理Loaded, 但是 duh 只触发了一次。
  • 我尝试了DataTemplate Trigger RoutedEvent
    FrameWorkElement.Loaded 但我很确定这不适合我的情况
  • 我尝试了 EventSetter 但 没有按照我想要的方式工作 要么

我尝试了其他一些事情,但我不太记得它们。

任何建议将不胜感激!

【问题讨论】:

    标签: wpf data-binding tabcontrol


    【解决方案1】:

    如果我正确读取了您的 XAML,您正在为 TabControl 创建单个 Chart 控件并在 TabItem 更改时更改其数据?如果是这样,您应该可以使用SelectionChanged 事件。

    最好将 Chart 控件放在 ItemTemplate 中,这样当用户切换选项卡或添加新选项卡时,它会自动加载选定的 Flights 数据。

    【讨论】:

    • 我不认为 SelectionChanged 是我需要的,因为当加载 tabitem 时,我需要在图表控件上调用方法:o(
    • 在这种情况下,会有一个 TabItemLoaded 事件。将目标类型 {x:Type TabItem} 的样式添加到 TabControl.Resources 并使用 EventSetter 设置 Loaded 事件。另一种方法是将图表控件从TabControl.ContentTemplate 移到TabControl.ItemTemplate 中,然后在其上运行Loaded 事件。
    • 我认为最初我避免使用 EventSetter,因为它会在每个现有选项卡上触发 Loaded 事件,而不仅仅是新添加的选项卡。我想我会修改这个,看看我是否只能处理新标签。谢谢!! :)
    【解决方案2】:

    您的Flights 集合应该是ObservableCollection<> 类型。 xaml 中的 ItemsSource 绑定将订阅其 CollectionChanged 事件并添加/删除选项卡。至于调用 Chart 上的方法,WindowsFormHost 有 Loaded 事件吗?因为将为每个创建的选项卡创建一个新选项卡。

    【讨论】:

    • 我建议将其更改为 ObservableCollection,因为 List 不会在添加新项目时自动更新 UI,ObservableCollection 会
    • 航班是列表类型。 TabControl 的 DataContext 设置为我的 ViewModel,它有一个名为 Flights 的属性,它是 List,所以我没有 CollectionChanged 事件。我不认为。 :o(
    • 现在 UI 会随着航班集合的更新而更新。
    • 将视图模型的 Flight 更改为 IList,然后您可以将 Flight 的 List 传递给 ObservableCollection 的构造函数并使用相同的方法,因为 ObservableCollection 实现了 IList
    • 我刚刚检查过,WindowsFormHost 确实 有一个 Loaded 事件。订阅它,然后调用图表上的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 2011-03-01
    • 2016-04-29
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    相关资源
    最近更新 更多