WPF,`Loaded` 事件仅在第一次视图模型初始化时触发,但不会在后续视图模型初始化时触发

Posted

技术标签:

【中文标题】WPF,`Loaded` 事件仅在第一次视图模型初始化时触发,但不会在后续视图模型初始化时触发【英文标题】:WPF, `Loaded` event is only fired on first viewmodel initialization but not subsequent ones 【发布时间】:2017-08-01 12:53:24 【问题描述】:

我像这样多次初始化 UserControl 的视图模型

ChartControl = new SciChartControlViewModel(true, false, true);

视图是通过ContentControl 渲染的

<Grid Grid.Row="1">
     <ContentControl Content="Binding ChartControl"/>
</Grid>

我像这样在视图中挂钩Loaded 事件

<i:Interaction.Triggers>

    <i:EventTrigger EventName="Loaded">
        <i:InvokeCommandAction Command="Binding OnViewLoadedCommand"/>
    </i:EventTrigger>

</i:Interaction.Triggers>

问题:只有在第一次初始化视图模型时,Loaded 事件才会触发。当我随后再次初始化视图模型时,Loaded 事件不再被触发。只有当控件失去焦点并重新聚焦时,它才会触发。

期望的行为:如何确保每次完全渲染视图时在我的视图模型中捕获?我需要捕获这一点,因为我在视图模型中对此控件执行的某些操作仅在视图完全呈现时才有效。

【问题讨论】:

您尝试过DataContextChanged 事件吗?如果您绑定到 Content 属性,不确定这是否有效。否则,您可以覆盖 Content 依赖属性的元数据,描述为 here @JanDotNet,太棒了,这行得通。尽管它仍然让我感到困惑,为什么每次丢弃当前视图模型实例并实例化一个新视图模型实例时都不会触发 Loaded 事件。可能是因为视图保持在原位,因此不会在后续视图模型实例中加载,但数据上下文会发生变化?请随时写一个快速的答案,很高兴将其标记为所需的答案... 【参考方案1】:

问题是,视图被初始化(并加载)一次,并且在更改内容时将被重用。

您可以尝试使用 DataContextChanged 事件 - 如果您绑定到 Content 属性,不确定是否有效。否则,您可以覆盖 Content 依赖属性的元数据,描述为 here。

【讨论】:

它有效,我从后面的代码中调用了命令 (var viewModel = (MyViewModel)DataContext; if (viewModel.MyCommand.CanExecute(null)) viewModel.MyCommand.Execute(null);)

以上是关于WPF,`Loaded` 事件仅在第一次视图模型初始化时触发,但不会在后续视图模型初始化时触发的主要内容,如果未能解决你的问题,请参考以下文章

在 Loaded 事件中未完成渲染

测试 WPF 控件而不将其添加到窗口

C# WPF 数据绑定DataContext;Window_Loaded时进行过数据绑定,指定DataContext;触发另一事件?

WPF TabControl Unload俩次的解决方案

WPF TabControl Unload俩次的解决方案

怎么给wpf添加一个窗体加载事件