2014-03-01 52 views
1

我有一個對象和一個相同對象的克隆。第一個作爲孩子添加在一個面板(畫布)中,第二個作爲孩子添加到另一個面板。現在,如果我正在對主對象執行一些操作(比如delete),克隆對象也被通知(刪除)的最佳方式是什麼。基本上,我正在尋找如何創建一個對象與它的克隆之間的鏈接?如何在對象與其克隆之間進行通信?

感謝

回答

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

有這樣做沒有簡單直接的方法,並加入同一個對象多次家長會拋出異常。所以你需要寫幾行代碼。我的猜測是你的方法在某種程度上是困難的,你需要重新思考這個問題。讓我給你一些建議:

如果你使用MVVM模式(或者你想選擇的標準路徑),定義視圖模型(應該從DependencyObject派生)爲對象,並結合雙方的DataContext對象到此ViewModel的一個實例。因此,查看對象引用相同的ViewModel。然後使用Commands來做任何事情的任何對象。

如果您不想走那麼遠,請爲對象及其克隆使用相同的樣式,並在該樣式中設置事件處理程序。

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

現在如果實現後面的代碼的事件處理程序,你可以在同一時間訪問這兩個對象和克隆:

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 
} 
+0

我畫布,而不是控制。所以,在風格的情況下,我無法設置TargetType。由於Canvas是從Panel類而不是Control派生的。 – user3364004

+0

這並不重要,因爲要使用這個'Style',你必須將'Canvas'的xaml代碼移動到'ControlTemplate'中,這樣容器類型仍然可以是任何東西,即'Control'。如果您嘗試將此樣式應用於任何類型的控件,則會覆蓋其模板並將其更改爲如上例所示的「邊框」。 – Bijan