본문 바로가기

분류 전체보기

(42)
[WPF] xaml에서 조건 사용 (조건부 컨트롤 숨기기) WPF에서 조건에 따라 컨트롤을 숨기려면 Visibility 속성을 사용해서 ViewModel에서 어쩌고 저쩌고... 오늘은 xaml에서 간단한 조건에 따라 컨트롤의 속성을 바꿔보도록 하자. 간단하게 텍스트박스에 입력된 텍스트를 오른쪽 버튼의 툴팁으로 표시해 주는 View를 만들었다. View.xaml ViewModel.cs namespace WpfMvvm.ViewModels { internal class View2ViewModel : ViewModelBase { private string _toolTipText; public string ToolTipText { get => _toolTipText; set => SetProperty( ref _toolTipText, value ); } } } 이렇게 마..
[WPF] 크로스 스레드 문제 해결 WPF에서 역시 크로스 스레드 문제가 발생할 수 있는데 보통 메인 스레드가 아닌 다른 스레드에서 뷰모델의 속성 값을 변경하려고 시도하거나 코드 비하인드에서 컨트롤을 수정하려 할 때 발생할 수 있다. 이러한 경우 WinForm에서의 Invoke() 대신 Dispatcher.Invoke() 를 사용하여 해결할 수 있다. public class View1 : Window { public View1() { InitializeComponent(); } public void button_Click(object sender, RoutedEventArgs e) { new Thread(myThread) { IsBackground = true }.Start(); } private void myThread() { for( ..
[WPF] ViewModel이 아닌 다른 클래스의 속성에 바인딩하기 WPF로 개발을 하다 보면 종종 DataContext로 지정될 ViewModel 객체가 아닌 다른 클래스로부터 데이터를 가져와야 하는 상황이 발생할 수 있다. 아래 코드를 보자. namespace MyProject.Core { public class ObjectManager : BindableBase { private static ObjectManager _instance; public static ObjectManager Instance => _instance ??= new(); private string _myString = string.Empty; public string MyString { get => _myString; set => SetProperty( ref _myString, value )..
[WPF] DependencyProperty에 대해서 - RelativeSource 사용하여 Binding하기 앞선 글에서 DependencyProperty를 사용하여 UserControl의 코드비하인드에 정의한 사용자 정의 속성에 바인딩을 해보았다. [WPF] DependencyProperty에 대해서 WPF에서 속성과 속성 간의 Binding을 통해 데이터를 View로 가져오거나 ViewModel로 보낼 수 있음을 앞선 글에서 알아보았다. 이러한 Binding이 이뤄지기 위해서는 반드시 필요한 조건이 있는데, Binding 하 cs-solution.tistory.com 바인딩을 하기 위해 PropertyMetadata에 PropertyChangedCallBack 메서드를 사용하여 사용자 정의 속성값이 변경되었을 때 각 컨트롤에 변경된 값들을 직접 지정해줬음을 기억할 것이다. 이번 글에서는 PropertyCha..
[C#] 문자열 05 - IndexOf() 문자열 찾기 String 클래스의 IndexOf() 메서드로 문자열 내에서 특정 문자 또는 부분 문자열이 시작되는 위치를 찾을 수 있다. string.IndexOf(string) - 문자열 내에서 지정된 문자열이 처음 등장하기 시작하는 인덱스를 반환한다. 문자열이 등장하지 않을 경우 -1을 반환한다. 자매품으로 string.IndexOf(char)도 가능하다. // 14 출력 Console.WriteLine("When you have faults, do not fear to abandon them.".IndexOf("faults").ToString()); // -1 출력 string str = "Age is no guarantee of maturity."; Console.WriteLine(str.IndexOf("th..
[WPF] XAML 코드 상에서 DataContext 지정하기 보통 ViewModel을 XAML 코드 상에서 지정하기 위해 ViewModel의 네임스페이스를 상단에 xmlns로 참조해주는 과정을 거쳐야 한다. 그러나 어차피 ViewModel의 네임스페이스는 DataContext를 지정할 때 한 번만 사용되며 이후로는 사용될 일이 딱히 없다. 이러한 경우 아래와 같이 1회성 네임스페이스 참조 구문을 사용할 수 있다. 먼저 임의의 네임스페이스를 사용한 다음, 뒤쪽에 바로 이어서 해당 네임스페이스의 세부 경로를 지정해주면 된다.
[WPF] Binding 기초 Binding이란, WPF에서 XMAL 코드로 구현된 View와 DataContext로 사용될 ViewModel이 데이터를 상호 의존하지 않고 주고 받을 수 있도록 해주는 기능이다. 각 계층간의 분리가 핵심인 MVVM 디자인 패턴을 적용하기 위해 필수적인 요소라고 할 수 있다. MVVM에서의 Binding에 대한 자세한 설명은 아래 글에서 이미 다루었으므로 이번 글에서는 Binding의 간단한 사용법에 대해서만 정리하고자 한다. [.NET Framework/WPF] - [WPF] MVVM 디자인 패턴 (2) [WPF] MVVM 디자인 패턴 (2) 지난 포스트에서 첨부했던 코드를 분석해보자. MVVM 디자인 패턴의 세 가지 핵심 요소를 중점으로 보려고 한다. 1. Binding Binding은 MVVM의 ..
[WPF] DependencyProperty에 대해서 WPF에서 속성과 속성 간의 Binding을 통해 데이터를 View로 가져오거나 ViewModel로 보낼 수 있음을 앞선 글에서 알아보았다. 이러한 Binding이 이뤄지기 위해서는 반드시 필요한 조건이 있는데, Binding 하려는 속성이 DependencyProperty(의존 속성) 여야 한다는 것이다. 보통 컨트롤의 속성과 ViewModel의 속성 간에 Binding을 하는데, 기본적으로 WPF에서 제공하는 컨트롤의 대부분의 속성은 의존 속성으로 구현이 되어 있기 때문에 DependencyProperty에 대한 개념을 알지 못해도 사용할 수 있었다. 아마 DependencyProperty의 존재에 대해 처음 직면하게 되는 경우는 사용자 정의 컨트롤(이하 UserControl)로 데이터 묶음을 Bin..
[WPF] MVVM 디자인 패턴 (3) - ViewModelBase MVVM 디자인 패턴으로 개발을 할 때 필수적인 요소 중 하나로 INotifyPropertyChanged 인터페이스를 구현하는 것이 있다. View와 ViewModel 간에 결합을 낮추면서 데이터를 주고받기 위해서 Binding을 사용하는데, 이 Binding이 데이터가 변화되는 시점을 감지하고 데이터를 가져가기 위해서는 데이터가 변화되었음을 알려줘야 하는 것이다. XAML 코드 상에서 컨트롤의 속성과 ViewModel의 속성을 Binding 하게 되면 내부적으로 속성의 변화를 감지하기 위해 ViewModel의 INotifyPropertyChanged 인터페이스에 선언된 PropertyChanged 이벤트에 감지 메서드를 등록할 것이다. 즉, ViewModel은 INotifyPropertyChanged ..
[C#] Thread가 백그라운드에서 살아있을 때 3줄 요약 Thread.IsBackgroud 를 true로 하면 응용프로그램이 종료될 때 스레드가 함께 종료된다. Thread.Abort()는 사용하지 말자. new Thread( myThreadFunc ) { IsBackgroud = true }.Start(); 로 스레드 한 줄 실행 가능. 일정한 동작을 반복하는 무한 루프 형태의 Thread는 응용프로그램이 종료될 때 함께 종료되어야 한다. 그래서 보통 아래와 같이 스레드에서 무한정 도는 루프를 스레드 외부에서 탈출시키기 위한 조건 변수를 매개로 동작을 제어하는 방법을 사용한다. private void button_Start_Click( object sender, EventArgs e ) { new Thread(loop).Start(); } priv..