프로그래밍/WPF

[WPF] File Drag & Drop MVVM Pattern using Behavior

흔한티벳여우 2022. 12. 7. 12:34
반응형

 외부의 파일을 종종 프로그램 내부로 가져와서 쓸때가 있다. 보통은 File Open Dialog등을 이용하여 가져올수도 있지만 그냥 파일 탐색기에서 여러 파일들을 선택해서 Drag & Drop형태로 가져올 때도 있다.

 이럴때 Behavior를 이용하여 File Drop을 사용하는 방법을 알아보자.

 

1. 우선 Drag & Drop의 영역을 선언해주고 Drop을 가능하도록 처리해준다. AllowDrop=True

<Grid AllowDrop="True">
<!--Drag & Drop 할 공간-->
</Grid>

2. 바인딩할 Behavior 클래스를 만든다.

class FileDropBehavior : Behavior<FrameworkElement>
{
    public static readonly DependencyProperty DroppedFilesProperty = DependencyProperty.Register("DroppedFiles", typeof(string[]), typeof(FileDropBehavior), new PropertyMetadata(default(string[])));
    public string[] DroppedFiles
    {
        get { return (string[])GetValue(DroppedFilesProperty); }
        set { SetValue(DroppedFilesProperty, value); }
    }

    protected override void OnAttached()
    {
        AssociatedObject.Drop += AssociatedObjectDrop;
    }

    private void AssociatedObjectDrop(object sender, DragEventArgs e)
    {
        if (e.Data.GetDataPresent(DataFormats.FileDrop))
        {
            DroppedFiles = (string[])e.Data.GetData(DataFormats.FileDrop);
        }
    }

    protected override void OnDetaching()
    {
        AssociatedObject.Drop -= AssociatedObjectDrop;
    }
}

위에 보는것과 같이 Drop된 Object가 File Drop인지 파악하고 만약 맞다면 해당 파일의 Path를 가지고 오도록 처리한다.

그리고 외부에서 바인딩 할 수 있도록 만든 DroppedFiles 변수에 집어 넣는다.

외부에서 이 클래스를 사용하여 바인딩할 경우, FileDrop이 일어나면 DroppedFiles에 File Path들이 갱신 될 것이다.

 

3. Xaml을 작성한다.

xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
xmlns:behavior="clr-namespace:SampleProject.ViewModel.Behavior"

우선 Behaviors를 사용하기 위해서 상단에 위와 같이 xaml에 선언해준다.

그리고 2번에서 작성한 Behavior 클래스를 사용할 수 있도록 선언한다.

<Grid AllowDrop="True">
    <i:Interaction.Behaviors>
        <behavior:FileDropBehavior DroppedFiles="{Binding DroppedFiles, Mode=TwoWay}"/>
    </i:Interaction.Behaviors>
</Grid>

그리고 VM에서 DroppedFiles가 변경될때마다 원하는 작업을 해주면 끝!!

반응형