C# 检测WPF控件中VisualTree或LogicalTree中的父级是否已更改

C# 检测WPF控件中VisualTree或LogicalTree中的父级是否已更改,c#,wpf,C#,Wpf,我需要知道VisualTree或LogicalTree中的父控件何时更改控件。我需要这个特性,因为每当父项发生更改时,我都需要重新评估控件的窗口类,以便可以附加命令和输入绑定 我有一个肮脏的方法,这意味着我需要附加到每个父元素,并检查父元素的事件更改,但我希望有另一个解决方案 例如: 我有一个用户控件 <UserControl x:Class="WpfApplication21.UserControl1"> <UserControl.CommandBinding

我需要知道VisualTree或LogicalTree中的父控件何时更改控件。我需要这个特性,因为每当父项发生更改时,我都需要重新评估控件的窗口类,以便可以附加命令和输入绑定

我有一个肮脏的方法,这意味着我需要附加到每个父元素,并检查父元素的事件更改,但我希望有另一个解决方案

例如:

我有一个用户控件

    <UserControl x:Class="WpfApplication21.UserControl1">
    <UserControl.CommandBindings>
        <CommandBinding Command="ApplicationCommands.Cut" Executed="SomeHandler"></CommandBinding>
    </UserControl.CommandBindings>
</UserControl>

我有一个包含一个或多个用户控件的窗口

<Window x:Class="WpfApplication21.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication21"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.CommandBindings>
        <CommandBinding Command="ApplicationCommands.New" Executed="SomeHandler"></CommandBinding>
    </Window.CommandBindings>
    <StackPanel>
        <local:UserControl1></local:UserControl1>
        <local:UserControl1></local:UserControl1>
    </StackPanel>
</Window>

虽然在这个示例中,我使用了相同的命令,但这里只是在示例中显示。实际上,每个控件都有不同的命令。每个UserControl的命令都需要合并到窗口的CommandBindings中(InputBindings也是如此,此处未显示)。每个UserControl都是从ViewModel动态创建的插件,因此每个ViewModel都有一个不同的视图(示例仅显示UserControl,但实际上它们是UserControl的派生)

出于这个原因,我创建了一个行为,该行为附加到由ViewModel(由我创建)实现的CommandProvider,这样就可以在没有代码落后的情况下完成

因为我有许多视图模型,因此也有视图,所以我需要管理命令-/InputBindings并将它们附加到窗口。一个问题是,并非每个视图都能获得焦点,而且不知何故,对于UserControl事件,如果它们被聚焦,则命令-/InputBindings无法工作

现在清楚一点了吗?我现在觉得情况有点复杂

我有一个肮脏的方法,这意味着我需要附加到每个父元素,并检查父元素的事件更改,但我希望有另一个解决方案

很抱歉让您失望,但没有其他方法,即没有“AnyParentChanged”活动或您可以连接的内容

您需要以某种方式迭代所有父元素,并将事件处理程序连接到每个父元素的适当事件。要么这样,要么重新考虑你的整个方法


取决于可视化树中的父级是否“更改”可能不是解决您试图执行的任何操作的最佳方法。

没有内置方法,因为这通常不是必需的(期望的)功能。你想要它是因为你违反了单一责任规则。最好的办法可能是重新设计一些更简单的东西。@Henkholtman我不能清楚地回答这个问题,你能解释一下吗?顺便说一句@O.R.Mapper我不是下一个投票人“我需要知道VisualTree或LogicalTree中的家长何时更改控件。”我无法理解这一点。@HenkHolterman很酷,msedi在这个问题上尽了最大努力,根据你的评论,我认为你清楚地理解了这个问题,你不会介意花两分钟的时间。@HenkHolterman:“你想要它,因为你违反了单一责任规则。”-大约1.5年前,我问了一个类似的问题:。它描述了一个我需要这种行为的用例。“取决于可视化树中的父级是否“更改”可能不是最好的方法“。也许你是对的,但我正在尝试将子元素的CommandBinding附加到窗口,因为我希望将所有命令捆绑在一个位置,并且无法集中控件。如果有更好的方法找到我的命令,请随时指示我;-)我真的在寻找一种更好的方法。您没有发布任何代码片段,因此很难确切知道您要做什么,但有一种方法可能是绑定到父窗口的ICommand属性,即所有子元素绑定到同一个命令。