반응형

프로그래밍 127

[WPF] File Drag & Drop MVVM Pattern using Behavior

외부의 파일을 종종 프로그램 내부로 가져와서 쓸때가 있다. 보통은 File Open Dialog등을 이용하여 가져올수도 있지만 그냥 파일 탐색기에서 여러 파일들을 선택해서 Drag & Drop형태로 가져올 때도 있다. 이럴때 Behavior를 이용하여 File Drop을 사용하는 방법을 알아보자. 1. 우선 Drag & Drop의 영역을 선언해주고 Drop을 가능하도록 처리해준다. AllowDrop=True 2. 바인딩할 Behavior 클래스를 만든다. class FileDropBehavior : Behavior { public static readonly DependencyProperty DroppedFilesProperty = DependencyProperty.Register("DroppedFile..

프로그래밍/WPF 2022.12.07

[WPF] Return StaticResource as IValueConverter

XAML 작업을 해보다 보면 특정 값에 따라 StaticResource가 변화시켜야하는 상황들이 있다. 나의 경우에서는 Icon을 DrawingImage로 만들어서 StaticResource로 참조하여 사용하고 있었는데 타입별로 이 Icon이 바뀌어야했다. Type 별로 Image를 선언하고 Visible을 제어하기보단 Source의 내용을 StaticSource의 값을 변화시키는게 더욱 효율적일 것이다. 위와 같이 Image Source에 넣기 위한 IconPerson과 IconCar라는 DrawingImage StaticSource가 있다. public class IconConverter : IValueConverter { public DrawingImage Person { get; set; } pu..

프로그래밍/WPF 2022.12.02

[WPF] ContextMenu Binding in TreeView

TreeView에 있는 데이터를 탐색기처럼 사용할 떄, 각 Item들을 오른쪽 버튼을 눌러 어떠한 작업을 할때가 있다. 이때 보통 ContextMenu를 사용하는데 Command와 CommandParameter를 사용해야하는데 일반적인 방법으론 잘 되지 않는다. 그래서 사용하는 방법이 Tag에 해당 최상위 컨트롤의 DataContext를 바인딩하고, MenuItem에서 Tag를 통해 가지고 오는 방법을 사용한다. 이때 CommandParameter는 오른쪽으로 선택된 아이템이 따라온다.

프로그래밍/WPF 2022.11.28

[WPF] Value Converter Default

아래와 같은 코드가 있다고 하자 여기서 BoolToVisibilityCollapsedConverter는 TrueFalseValue라는 값이 True면 Visible, False면 Collapsed ReverseBoolToVisibilityCollapsedConverter는 반대라고 하자. 코드는 명백히 TextBlock을 선택적으로 보여주길 원한다고 볼 수 있다. 그런데 만약 Model 객체가 Null 이면 어떻게 될까? 그렇게 되면 TextBlock 둘은 동시에 표시될 것이다. 이점을 막기 위해서 FallbackValue를 이용한다. https://learn.microsoft.com/ko-kr/dotnet/api/system.windows.data.bindingbase.fallbackvalue?view..

프로그래밍/WPF 2022.11.04

[WPF] Visibility Control based on ComboBox Selection

ComboBox에서 선택된 값을 바인딩하여 다른 컨트롤을 제어하고 싶을때가 있다. 만약 Visible을 제어한다고 한다면 일반적으로 아래와 같이 생각하기 쉽다. Visible Hidden 하지만 위와 같이 작성하면 안된다. 왜나면 ComboBox에 바인딩할때 SelectedValue나 SelectedItem 등을 바인딩하면 ComboBoxItem을 가져오기 때문이다. 이를 우회하기 위해 Tag를 아래와 같이 이용하는 방법을 사용할 수 있다. Visible Hidden 각 ComboBoxItem에 Tag를 지정해주고, SelectedItem == ComboboxItem 임으로 ComboBoxItem의 Tag를 가져와서 Property를 제어할 수 있다.

프로그래밍/WPF 2022.10.22

[WPF] DataGrid Row Num Column 추가하기

DataGrid를 사용할 떄, 데이터의 Row Num을 표시하고 싶을 때가 있다. 데이터에 Index 값이 있으면 바로 바인딩 처리하면되지만 해당 칼럼데이터가 없다면 Item과 ItemsSource를 IMultiValueConverter으로 바인딩하여 Index를 알아내는 방법으로 표현 가능하다. // DataGrid에 바인딩할 데이터 클레스 선언 public class GridData { public string Data { get; set; } } Converter 선언 public class RowNumberConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter,..

프로그래밍/WPF 2022.10.13

[WPF] OpenFileDialog 폴더 선택하기

기존에 OpenFileDialog를 이용하면 파일을 선택할 수 있다. 하지만 경로를 선택해야 할 경우 폴더를 선택해야한다. 뭐... 몇가지 방법이 있는데 WinForm Namespace를 추가하여 사용하는 FolderBrowserDialog는 아래와 같은 다이어로그를 만나볼 수 있다. 해당 방법은 다이어로그가 맘에 들지 않을 것이다. 나같은 경우는 Nuget에서 WindowsAPICodePack 패키지를 설치하여 이용한다. 1. Nuget 에서 WindowsAPICodePack 를 검색한 뒤 설치한다. 2. 아래의 코드 블럭을 이용해 사용한다. using (var dialog = new CommonOpenFileDialog()) { dialog.IsFolderPicker = true; if (dialog..

프로그래밍/WPF 2022.10.13

[WPF] ComboBox 선택에 따라 컨트롤 바꾸기 - Control Switching by ComboBox

화면을 제작하다보면 선택형 Control (이 포스트의 예로는 ComboBox)에 따라 내가 원하는 컨트롤들을 보여주기를 원할 때가 많다. Converter를 배운 사람이라면 먼저 Visible을 이용하여 컨트롤을 먼저 떠오를텐데 이것을 이용하는 것보다 좀더 손쉽고 간단한 방법이 있다. 이것은 Template를 동적으로 변경해주는 것인데 아래와 같은 방식으로 손쉽게 처리할 수 있다.

프로그래밍/WPF 2022.09.26

[WPF] 오류 해결: 리소스를 찾을 수 없습니다. 리소스 이름은 대/소문자를 구분합니다.

WPF Project를 진행하던 도중 내가 만든 UserControl 내에 DrawingImage으로 만든 아이콘을 리소스로 사용할때 생긴 일이다. 분명 ResourceDictionary에 Icon들을 정상적으로 선언하고 App.xaml에 등록을하였다. 심지어 UserControl 내에서 정상적으로 StaticResource에 관한 인텔리센스까지 나와서 UserControl을 구성하는데 문제가 없었다. 그러나 이 UserControl을 사용하는 Page에서 내가 만든 UserControl에 Icon 리소스를 찾을 수 없다며 디자이너에서 오류를 발생시켰다. (물론 실행을 시키면 정상동작하였다.) 디자이너를 사용할수 없으면 작업 속도가 많이 떨어지게 되니 이점을 해결하고자 하였고 이것은 VS 2017버전부터..

프로그래밍/WPF 2022.09.23

[WPF] TabControl Header에 Close Button 구현 MVVM 패턴

WPF 에서 TabControl을 사용하다보면 Tab을 추가 및 삭제 처리를 해야하는 경우가 많다. Main Content에 쓰이는 TabControl에는 대부분 Tab Header에 닫기 버튼이 존재 하는경우가 다수 있다. 기본 TabControl에는 존재 하지 않으니 MVVM 패턴을 이용하여 이를 구현하는 방법에 대해 알아보도록 하자. 일단 기본적으로 ItemsSource에 들어갈 기본 객체를 선언해보자. public interface ITab { string Header { get; set; } ICommand CloseCommand { get; } event EventHandler CloseEvent; object DataContext { get; set; } } public class Tab :..

프로그래밍/WPF 2022.09.21
반응형