如何在对象与其克隆之间进行通信?

时间:2014-03-01 10:31:16

标签: wpf

我有一个对象和同一个对象的一个​​克隆。第一个作为孩子添加到一个面板(画布)中,第二个作为孩子添加到另一个面板。现在,如果我在主对象上执行某些操作(比如删除),克隆对象也会被通知(删除)的最佳方式是什么。基本上,我正在寻找如何在对象和它的克隆之间创建链接?

由于

2 个答案:

答案 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}"/>