#705 – 拖拽可序列化類型的數據(Dragging a Custom Object Using Serialization as Format)

有的時候,我們希望拖拽過來的數據或者屬性能直接參與到綁定當中,這種情況下可以將拖拽數據創建爲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 實例後,拖拽到另一個裏面。

705-001

705-002

下面是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;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章