我有一个对象和同一个对象的一个克隆。第一个作为孩子添加到一个面板(画布)中,第二个作为孩子添加到另一个面板。现在,如果我在主对象上执行某些操作(比如删除),克隆对象也会被通知(删除)的最佳方式是什么。基本上,我正在寻找如何在对象和它的克隆之间创建链接?
由于
答案 0 :(得分:0)
鉴于细节,如果你想要两者始终保持同步,那么我宁愿建议“避免克隆”。除非你有更好的理由维护克隆,否则让两个工作在同一个实例上。
如果您要同步某些属性集,请考虑将这些属性移动到其他类,并使两个(原始和克隆)共享该实例。
这样的事情:
public class PartiallyCloneable{
public SharedValue Shared{get;set;}
public ClonedValue Cloned{get;set;}
public PartiallyCloneable Clone(){
//deep copy ClonedValue, return same instance of SharedValue
}
}
public class SharedValue{
}
public class ClonedValue{
}
答案 1 :(得分:0)
没有简单的直接方法,将相同的对象添加到多个父项将抛出异常。所以你需要编写几行代码。我的猜测是你的方法在某种程度上是一个困难的方法,你需要重新思考这个问题。让我给你一些想法:
如果您正在使用MVVM模式(或者您想选择标准路径),请为您的对象定义 ViewModel (应该从DependencyObject
派生)并绑定{{两个对象的1}}到此ViewModel的一个实例。这样两个 View 对象都引用相同的 ViewModel 。然后使用Commands对任一对象执行操作。
如果您不想走那么远,请为对象及其克隆使用相同的样式,并在该样式中设置事件处理程序。
DataContext
还将每个对象的Tag绑定到其他对象。
<Style x:Key="myStyle" TargetType="Control">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Border BorderThickness="1" BorderBrush="Black" Unloaded="objectUnloaded">
<StackPanel>
<TextBlock Text="something"/>
<Button Content="delete" Click="deleteButtonClicked"/>
<Button Content="otherStuff" Click="otherStuffButtonClicked"/>
</StackPanel>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
现在如果你在后面的代码中实现这些事件处理程序,你可以同时访问对象和克隆:
<Control x:Name="main" Style="{StaticResource myStyle}"
Tag="{Binding ElementName=clone}"/>
<Control x:Name="clone" Style="{StaticResource myStyle}"
Tag="{Binding ElementName=main}"/>