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
}