有的時候,我們希望拖拽過來的數據或者屬性能直接參與到綁定當中,這種情況下可以將拖拽數據創建爲Serializable。
下面的例子中,有一個Dog 類型的變量參與了綁定,它的屬性值會顯示到Label 控件上。
<StackPanel Orientation="Vertical" HorizontalAlignment="Center"
MouseLeftButtonDown="StackPanel_MouseLeftButtonDown"
AllowDrop="True" Drop="StackPanel_Drop">
<Label Content="{Binding TheDog.Name}" FontWeight="Bold"/>
<Label Content="{Binding TheDog.Age}"/>
<Label Content="{Binding TheDog.BarkSound}"/>
<Button Content="Create Dog" Click="Button_Click"/>
</StackPanel>
上面代碼中,前三個Label 分別顯示Dog的Name、Age和BarkSound 屬性。並且有一個按鈕,每次點擊按鈕就會創建一個Dog類型的實例賦值給TheDog變量。
public partial class MainWindow : Window, INotifyPropertyChanged
{
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
}
private Dog theDog; // 定義一個Dog類型變量
public Dog TheDog
{
get { return theDog; }
set
{
if (value != theDog)
{
theDog = value;
RaisePropertyChanged("TheDog"); // 當屬性值發生改變時,進行通知。以更改界面的顯示。
}
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
TheDog = new Dog("Kirby", 15, "Woof"); // 點擊按鈕創建一個Dog類型的變量
}
private void StackPanel_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
DataObject data = new DataObject(DataFormats.Serializable, theDog); // 創建Serializable格式的拖拽數據
DragDrop.DoDragDrop((DependencyObject)e.Source, data, DragDropEffects.Copy);
}
private void StackPanel_Drop(object sender, DragEventArgs e)
{
TheDog = (Dog)e.Data.GetData(DataFormats.Serializable); // 接收到數據
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string prop)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(prop));
}
}
下面是開啓兩個一樣的程序,從一個程序中創建Dog 實例後,拖拽到另一個裏面。
下面是Dog 類的定義:
[Serializable]
public class Dog
{
public string Name { get; set; }
public int Age { get; set; }
public string BarkSound { get; set; }
public Dog(string name, int age, string barkSound)
{
Name = name;
Age = age;
BarkSound = barkSound;
}
}