반응형

MVVM 10

[WPF] DataGrid에서 SelectedItems를 ViewModel과 바인딩하는 방법

오늘은 WPF DataGrid에서 선택된 항목들(SelectedItems)을 ViewModel과 바인딩하는 방법에 대해 알아보겠습니다. WPF의 DataGrid는 강력한 기능을 제공하지만, 선택된 항목들을 ViewModel에 직접 바인딩하는 기능은 제공하지 않습니다. 그러나 Blend SDK의 Behavior 클래스를 활용하여 이 문제를 해결할 수 있습니다. 먼저, DataGridSelectedItemsBehavior라는 이름의 새 클래스를 생성하고, 이 클래스를 Behavior로 상속합니다. public class DataGridSelectedItemsBehavior : Behavior { // ... } 다음으로, SelectedItems라는 DependencyProperty를 정의합니다. 이 프로퍼..

프로그래밍/WPF 2023.03.27

[WPF] Close popup when mouse leave

Popup에서 StaysOpen을 False로 두면 해당 팝업 컨트롤에서 포커스를 잃으면 알아서 닫힌다. 근데 포커스를 잃을려면 마우스를 누르거나 다양한 방법으로 상호작용을 해야하는데 이것마저 해서는 안되는 경우가 종종있다. 나의 경우는 그냥 팝업 화면에서 마우스만 빠져나가도 팝업이 닫게 하고 싶었다. Behind Code로 작성하면 편하겠지만 MVVM 패턴으론 쉽게하기 어려우니 Behavior를 쓰기로 했다. 일단 Behavior Class를 만들어준다. class ClosePopupBehavior : Behavior { protected override void OnAttached() { AssociatedObject.Child.MouseLeave += Child_MouseLeave; } privat..

프로그래밍/WPF 2022.12.20

[WPF] Binding SelectedItems (ItemsControl, DataGrid 등)

ItemsControl이나 DataGrid 등의 List형 데이터를 Source로 가지는 컨트롤들은 Code behind에서 SelectedItems에 접근할 수 있다. 하지만 Xaml 에서 접근하려고 한다면 SelectedItem 만 접근 가능하다. 자. 이제부터 문제의 시작이다. MVVM 패턴에서 직관적으로 접근하려고 한다면 SelectedItem밖에 Binding 못한다. 하지만 여러개의 Row를 선택하고, 이러한 Row를 이용하여 어떠한 작업을 하려면 다른 방법을 써야한다. DataGrid를 예를 들어 설명하도록 하겠다. Xaml ViewModel // Multi Selection이 발생됬을때 받아올 Property 선언 public List SelectedItems { get; set; } = ..

프로그래밍/WPF 2022.12.07

[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

[WPF] MouseBinding KeyBinding Binding

WPF 를 사용하다보면 마우스나 키보드를 이용하여 상호작용을 해야할 때가 있다. 이럴때 컨트롤에 InputBindings을 이용하여 MVVM으로 바인딩하는 방법이 있다. MouseBinding 할때 Gesture를 이용해도 되고, MouseAction을 사용해도 된다. 보통은 저렇게 쓸때 자동완성기능에 없는데 MouseBinding의 경우 아래의 URL가서 MouseAction 관련 Enum을 확인하면된다. https://docs.microsoft.com/ko-kr/dotnet/api/system.windows.input.mousebinding?view=windowsdesktop-6.0 MouseBinding 클래스 (System.Windows.Input) MouseGesture를 RoutedComman..

프로그래밍/WPF 2022.08.03

[WPF] TreeView MVVM IsSelected & IsExpanded Binding

일단 TreeView의 사용법을 한번 알아보자. 위와 같이 xaml을 작성한다면 아래와 같이 나온다. 우리가 여기서 중점적으로 봐야하는것은 ComboBox에서 ComboBoxItem 마냥 TreeViewItem이라는 컨트롤이다. https://docs.microsoft.com/ko-kr/dotnet/api/system.windows.controls.treeviewitem?view=windowsdesktop-6.0 TreeViewItem 클래스 (System.Windows.Controls) TreeView 컨트롤에 선택 가능한 항목을 구현합니다. docs.microsoft.com TreeViewItem 을 MS Docs에서 확인해보면 속성으로 IsExpanded, IsSelected, IsSelection..

프로그래밍/WPF 2022.08.03

[WPF] ItemControl에서 Item Index binding

ItemControl 등에서 각 itemsSource에 있는 파일을 삭제 처리나 수정 처리 할 때, 방법에 따라 다양하지만 해당 ItemTemplate에 추가나 삭제 버튼을 만들어 처리하는게 일반적이다. 이때 해당 ItemsSource의 Index값을 가져와서 처리하는 방법을 알아보자. ViewModel class ConfigViewModel : DialogViewModelBase { private string _address; public string Address { get { return _address; } set { SetProperty(ref _address, value); } } public ObservableCollection IP { get; set; } public DelegateCom..

프로그래밍/WPF 2021.05.11

[WPF] Value Converter

바인딩 처리를 하다보면 값에 따라 화면에 바인딩 되어야하는 값이 달라야 할때가 있다. 예를들어 bool 값을 이용하여 visible처리 할 때나, 퍼센트 값에 따라 폰트 컬러가 달라진다거나 하는 기타 등등의 요소가 존재한다. 이를 위한 Value Converter 사용법은 아래와 같다. ViewModel에 컨버터 클래스를 선언한다. public abstract class BaseOnewayConverter : MarkupExtension, IValueConverter { public BaseOnewayConverter() { } // source to binding target public abstract object Convert(object value, Type targetType, object pa..

프로그래밍/WPF 2021.05.10

[WPF] MVVM에서 IDialogService 사용

mvvm을 사용할 때, Dialog용 Service를 만들어서 사용하는 방법을 기술하겠다. 위의 구조대로 만들 예정이다. 만약 새로운 화면이 필요하다면 커스텀 DialogView를 이용하여 처리하면 된다. IDialogWindow.cs namespace CounterMonitor.Dialogs.Service { public interface IDialogWindow { bool? DialogResult { get; set; } object DataContext { get; set; } bool? ShowDialog(); } } 창을 띄울 화면 생성 DialogWindow.xaml 해당 위의 인터페이스를 상속하자 DialogWindow.xaml.cs using System.Windows; namespace..

프로그래밍/WPF 2021.05.10

[WPF] IGrouping 데이터 바인딩 하기

LINQ를 사용하다보면 group를 사용하여 그룹화를 시켜줄 때가 많다. 이때, group 사용 시에 IGrouping Interface를 반환받게 되는데 이것을 데이터 바인딩 하는 방법을 알아본다. Model DTO public class IoTStatus : BindableBase { private int _line; public int Line { get { return _line; } set { SetProperty(ref _line, value); } } private int _table; public int Table { get { return _table; } set { SetProperty(ref _table, value); } } } Service public async Task GetI..

프로그래밍/WPF 2021.05.06
반응형