Binding 在WPF中,如何在不导致内存泄漏的情况下侦听RouteDicCommand的text属性的更改?

Binding 在WPF中,如何在不导致内存泄漏的情况下侦听RouteDicCommand的text属性的更改?,binding,dependency-properties,inotifypropertychanged,routedcommand,Binding,Dependency Properties,Inotifypropertychanged,Routedcommand,在WPF中,RoutedUICommand不是依赖项对象,也没有实现INotifyPropertyChanged,这意味着如果要将其文本属性绑定到UI中的某个对象,例如菜单项的标题,并且模式不是一次性的,动态加载的上下文菜单或UI可能会导致内存泄漏,在加载和卸载这些UI时,经常会创建和销毁项 相反,如果您一次性使用,,则可以避免泄漏,但会丢失更改通知,因为菜单文本需要根据应用程序中的状态进行动态更新。(想想典型的“将'xxx'另存为…”命令如何更改以反映当前项的名称。) 也就是说,我们如何正确地

在WPF中,
RoutedUICommand
不是依赖项对象,也没有实现
INotifyPropertyChanged
,这意味着如果要将其
文本
属性绑定到UI中的某个对象,例如菜单项的标题,并且
模式
不是一次性的,动态加载的上下文菜单或UI可能会导致内存泄漏,在加载和卸载这些UI时,经常会创建和销毁项

相反,如果您一次性使用
,则可以避免泄漏,但会丢失更改通知,因为菜单文本需要根据应用程序中的状态进行动态更新。(想想典型的
“将'xxx'另存为…”
命令如何更改以反映当前项的名称。)

也就是说,我们如何正确地绑定到文本并获得更改而不导致内存泄漏


我们建议的解决方案是创建
RoutedCommand
(注意:没有“UI”)的子类,其中我们创建自己的
Text
属性,并实现
INotifyPropertyChanged
,以支持它。但是,我们不确定WPF的内置支持是否会出现问题,例如自动将
MenuItem
的头绑定到
Text
属性,因为它不是
RoutedUICommand
。(注意,我们可以只使用一个真正的
RoutedUICommand
对象,然后在
Text
属性上“新建”,但在那里,您可能会遇到如何访问属性的问题,因此如果可能,我们宁愿避免这样做。)

为什么不明确清除绑定?BindingOperations.ClearBinding(MyTextBox、TextBlock.TextProperty);嗯。。。你把我弄丢了。我不太清楚。这适用于出现在菜单或上下文菜单中的RoutedUICommand,当RoutedUICommand中的文本发生更改时,我们希望菜单中的文本发生更改。但正如我所说,RouteDuicCommand不支持任何更改通知,也不是依赖项对象,因此我们不确定如何避免泄漏。这与清除绑定无关。事实上,这与我们想要的正好相反。我们想要装订。。。没有泄漏。不清楚你想要实现什么,你能发布一些代码吗?@MarqueIV绑定只是当你不再需要它时的一个问题。什么构成不再需要它将有所不同。移出范围是一个典型的场景,在这种情况下,您只需调用ClearBinding来缓解潜在的泄漏。如果绑定在使用中,这不是一个漏洞,当绑定不再需要时,这是一个漏洞。@Aaron,正如我所说的,这些是动态UI,并试图实现一种处理模式,我们手动清除每个菜单项上的绑定(或任何绑定到RoutedUICommand文本的内容)这是不可行的,因为应用程序中有100多个菜单项和命令(同样,UI是动态的)。此外,MenuItem在给定RouteDiCommand时会进行一些自动绑定,所以我不确定我们是否可以清除该绑定,因为我不知道框架在幕后是如何实现的。