WPF&x2B;国际奥委会:“;指定的Visual已经是另一个Visual的子级或CompositionTarget的根;

WPF&x2B;国际奥委会:“;指定的Visual已经是另一个Visual的子级或CompositionTarget的根;,wpf,spring,xaml,inversion-of-control,Wpf,Spring,Xaml,Inversion Of Control,[编辑:沿着mvvm路线重新思考架构使这个问题基本上消失了-谢谢] 使用Spring.NET+WPF 在配置中加载两个WPF按钮: <object name="Button1" type="System.Windows.Controls.Button, PresentationFramework" > <property name="Name" value="Next" /> <property name="Width" value="200"/>

[编辑:沿着mvvm路线重新思考架构使这个问题基本上消失了-谢谢]

使用Spring.NET+WPF

在配置中加载两个WPF按钮:

<object name="Button1" type="System.Windows.Controls.Button, PresentationFramework" >
  <property name="Name" value="Next" />
  <property name="Width" value="200"/>
  <property name="Content" value="Next"/>
</object>
<object name="Button2" type="System.Windows.Controls.Button, PresentationFramework" >
  <property name="Name" value="Back" />
  <property name="Width" value="200"/>
  <property name="Content" value="Back"/>
</object>   

拥有相同的哈希代码并不意味着对象实例是相同的。检查它们是否实际上是同一实例的一种简单方法是在构造函数中设置断点,并在“监视”窗口中计算此表达式:

object.ReferenceEquals(buttons[0], buttons[1])
如果
true
,则它们是完全相同的对象,这就是您的问题

也就是说,我认为创建多个控件的可能性更大,每个控件都通过Spring配置导入相同的
按钮

根据,对象的默认范围是
singleton
。您真正想要的是Spring为每个需要按钮的控件创建一个新的按钮实例。因此,您的配置应该更像这样:

<object name="Button1" type="System.Windows.Controls.Button, PresentationFramework" singleton="false">
  <property name="Name" value="Next" />
  <property name="Width" value="200"/>
  <property name="Content" value="Next"/>
</object>


说到这里,我认为使用MVVM方法会更好。您可以让Spring提供视图模型实例(可以毫无问题地共享),并根据该模型生成UI。

-MVVM:很好的建议。-春天单身汉:啊!
<object id="eventListener2" type="MyEventListener">
<listener event="Click" method="b_Click">
<ref object="Button2" />
</listener>
</object>
object.ReferenceEquals(buttons[0], buttons[1])
<object name="Button1" type="System.Windows.Controls.Button, PresentationFramework" singleton="false">
  <property name="Name" value="Next" />
  <property name="Width" value="200"/>
  <property name="Content" value="Next"/>
</object>