Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如何在对象及其克隆之间进行通信?_Wpf - Fatal编程技术网

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

Wpf 如何在对象及其克隆之间进行通信?,wpf,Wpf,我有一个对象和同一对象的一个克隆。第一个作为子对象添加到一个面板(画布)中,第二个作为子对象添加到另一个面板中。现在,如果我在主对象上执行一些操作(比如删除),那么克隆对象也会得到通知(删除)的最佳方式是什么。基本上,我在寻找如何在对象和它的克隆之间创建链接 谢谢提供了详细信息,如果您希望两者始终同步,那么我建议您“避免克隆”。除非您有更好的理由维护克隆,否则请使这两个实例在同一个实例上工作 如果有一些要同步的属性,那么考虑将这些属性移动到不同的类,并使这两个(原始和克隆)共享该实例。 大概是这

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


谢谢

提供了详细信息,如果您希望两者始终同步,那么我建议您“避免克隆”。除非您有更好的理由维护克隆,否则请使这两个实例在同一个实例上工作

如果有一些要同步的属性,那么考虑将这些属性移动到不同的类,并使这两个(原始和克隆)共享该实例。

大概是这样的:

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{
}

并没有简单直接的方法可以做到这一点,将同一对象添加到多个父对象将引发异常。所以你需要写几行代码。我猜你的方法有点困难,你需要重新思考这个问题。让我给你一些想法:

如果您使用的是MVVM模式(或者您希望选择标准路径),请为您的对象定义一个ViewModel(它应该派生自
DependencyObject
),并将两个对象的
DataContext
绑定到此ViewModel的一个实例。以便两个视图对象都引用相同的ViewModel。然后使用对任一对象执行操作

如果不想走那么远,请对对象及其克隆使用相同的样式,并在该样式内设置事件处理程序

    <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>

我有画布而不是控制。因此,就样式而言,我无法设置TargetType。因为Canvas是从Panel类而非Control派生的。这并不重要,因为为了使用此
样式
,您必须将
Canvas
的xaml代码移动到
ControlTemplate
中,以便容器类型仍然可以是任何类型,即
Control
。如果尝试将此样式应用于任何类型的控件,它将覆盖其模板并将其更改为
边框,如上面的示例所示。
    <Control x:Name="main" Style="{StaticResource myStyle}" 
         Tag="{Binding ElementName=clone}"/>
    <Control x:Name="clone" Style="{StaticResource myStyle}" 
         Tag="{Binding ElementName=main}"/>
private void otherStuffButtonClicked(object sender, RoutedEventArgs e)
{
    var obj = sender as FrameworkElement;
    var other = (obj.TemplatedParent as FrameworkElement).Tag;
    //do stuff to obj
    //do stuff to other
}