我有一個對象和一個相同對象的克隆。第一個作爲孩子添加在一個面板(畫布)中,第二個作爲孩子添加到另一個面板。現在,如果我正在對主對象執行一些操作(比如delete),克隆對象也被通知(刪除)的最佳方式是什麼。基本上,我正在尋找如何創建一個對象與它的克隆之間的鏈接?如何在對象與其克隆之間進行通信?
感謝
我有一個對象和一個相同對象的克隆。第一個作爲孩子添加在一個面板(畫布)中,第二個作爲孩子添加到另一個面板。現在,如果我正在對主對象執行一些操作(比如delete),克隆對象也被通知(刪除)的最佳方式是什麼。基本上,我正在尋找如何創建一個對象與它的克隆之間的鏈接?如何在對象與其克隆之間進行通信?
感謝
給出的細節,如果你想既要始終保持同步那我寧願建議「避免克隆」。使這兩個工作在同一個實例上,除非你有更好的理由維護克隆。
如果有一組要同步的屬性,請考慮將它們移動到不同的類並使兩個(原始和克隆)共享該實例。
事情是這樣的:
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模式(或者你想選擇的標準路徑),定義視圖模型(應該從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
}
我畫布,而不是控制。所以,在風格的情況下,我無法設置TargetType。由於Canvas是從Panel類而不是Control派生的。 – user3364004
這並不重要,因爲要使用這個'Style',你必須將'Canvas'的xaml代碼移動到'ControlTemplate'中,這樣容器類型仍然可以是任何東西,即'Control'。如果您嘗試將此樣式應用於任何類型的控件,則會覆蓋其模板並將其更改爲如上例所示的「邊框」。 – Bijan