2월, 2019의 게시물 표시

[WPF] 공공데이터 포털 API 이용 클라이언트 구현 Part 3

이미지
그룹핑 ListViewItem 그룹핑 할 수 있습니다. 먼저 CheckBox에 Checked 이벤트를 통해 그룹핑을 추가하고 RemoveChecked 이벤트를 통해 그룹핑을 제거 할 수 있도록 CheckBox를 선언 합니다. 1: <!-- Group CheckBox --> 2: <CheckBox Grid.Column="0" 3: Grid.Row="0" 4: Checked="AddGrouping" 5: Unchecked="RemoveGrouping">Group by Name</CheckBox> 그룹 스타일 선언 GroupStyle 속성에 ContainerStyle 속성을 이용해 Style을 지정 합니다. Expander 컨트롤을 이용해 아파트명과 그룹 아이템의 개수를 Expander Header에 표시 하도록 ControlTemlate를 선언 합니다. 1: <!-- Group Style --> 2: <ListView.GroupStyle> 3: <GroupStyle> 4: <GroupStyle.ContainerStyle> 5: <Style TargetType="{x:Type GroupItem}"> 6: <Setter Property="Margin" Value="0,0,0,5" /> 7: <Setter Property="Te...

MSDN WPF 샘플 따라하기 - CollectionBinding

CollectionBinding 이 예제는 ObservableCollection<T>에서 파생 되는 항목이 추가 되거나 제거 될 때 알림을 제공 하는 컬렉션 클래스 만들고 컬렉션에 바인딩하는 방법을 보여 줍니다. 컬렉션 구현 1: public class Person : INotifyPropertyChanged 2: { 3: private string _firstname; 4: private string _lastname; 5: private string _hometown; 6: public string LastName 7: { 8: get { return _lastname; } 9: set 10: { 11: if (_lastname != value) 12: { 13: _lastname = value; 14: OnPropertyChanged("LastName"); 15: } 16: } 17: } 18: public string FirstName 19: { 20: get { return _firstname; } 21: set 22: { 23: if (_firstname != value) 24: { 25: _firstname = value; 26: OnPropertyChanged("FirstName"); 27: } 28: } 29: } 30: public string HomeTown 31: { 32: get { ...

MSDN WPF 샘플 따라하기 - BusinessLayerValidation

BusinessLayerValidation 이 예제에서는 사용자 지정 개체에서 유효성 검사를 구현 하고 바인딩하는 방법을 보여 줍니다. 바인딩 객체 구현 IDataErrorInfo 인터페이스를 상속하는 Person 객체를 구현 합니다. Age 속성이 0보다 작거나 150보다 클 경우 에러 메시지를 반환합니다. 1: public class Person : IDataErrorInfo 2: { 3: public int Age { get; set; } 4: public string Error => null; 5: public string this[string name] 6: { 7: get 8: { 9: string result = null; 10: if (name == "Age") 11: { 12: if (Age < 0 || Age > 150) 13: { 14: result = "Age must not be less than 0 or greater than 150."; 15: } 16: } 17: return result; 18: } 19: } 20: } 사용자 지정 개체 유효성 검사 바인딩 TextBox.Text 속성에 Person.Age 속성을 바인딩 하고, ValidatesOnException 속성을 True로 설정 해 사용자에게 예외 관련 알림을 구현하고, DataErrorValidationRule을 이용해 사용자 정의 유효성 검사의 알림을 구현 합니다. 1: <StackPanel Margin="20"> 2: ...

MSDN WPF 샘플 따라하기 - BindingToStringFomat

이미지
BindingToStringFomat 데이터 바인딩의 결과로 문자열을 표시하려는 경우 Binding의 StringFormat 속성을 사용하면 쉽게 디스플레이를 사용자 정의 할 수 있습니다. 이 예제에서는 바인딩과 멀티 바인딩 시 사용되는 StringFormat에 대해 설명 합니다. 바인딩 객체 정의 1: public class PurchaseItem 2: { 3: public PurchaseItem() { } 4: public PurchaseItem(string desc, double price, DateTime endDate) 5: { 6: Description = desc; 7: Price = price; 8: OfferExpires = endDate; 9: } 10: public string Description { get; set; } 11: public double Price { get; set; } 12: public DateTime OfferExpires { get; set; } 13: public override string ToString() 14: { 15: return $"{Description}, {Price:C}, {OfferExpires:D}"; 16: } 17: } 바인딩 컬렉션 객체 정의 1: public class ItemsForSale : ObservableCollection<PurchaseItem> 2: { 3: public ItemsForSale() 4: { 5: Add((new PurchaseItem("Snowboard and bindings", 120, new DateTime(2009...

MSDN WPF 샘플 따라하기 - BindValidation

이미지
BindValidation 이 예제는 ErrorTemplate 및 사용자 지정 유효성 검사 규칙을 기반으로 잘못 된 값을 입력하는 경우 사용자에게 시각적 피드백을 제공하는 스타일 트리거를 사용하는 방법을 제공 합니다. 바인딩 소스 개체 정의 1: public class MyDataSource 2: { 3: public int Age { get; set; } 4: public int Age2 { get; set; } 5: public int Age3 { get; set; } 6: public MyDataSource() 7: { 8: Age = 0; 9: Age2 = 0; 10: } 11: } 유효성 검사 규칙 설정 바인딩 소스 개체의 Age속성을 TextBox.Text 속성에 바인딩 합니다. AgeRangeRule 이라는 유효성 검사 규칙을 사용하도록 설정되어 있으므로 숫자가 아닌 문자열 또는 21보다 작거나 130보다 큰 값을 입력하면 빨간색 느낌표가 텍스트 상자 옆에 나타나고 텍스트 상자 위로 마우스를 이동하면 오류 메시지가 포함된 도구 설명이 나타납니다. 1: <TextBlock Grid.Row="0" Grid.ColumnSpan="2" FontSize="20" Margin="8" Text="Enter a number between 21-130 or there will be a validation error:" /> 2: <Label Grid.Column="0" Grid.Row="1" FontSize="15" Margin="2" Target="{Binding ElementName=textBox...

MSDN WPF 샘플 따라하기 - DirectionalBinding

이미지
DirectionalBinding 이 예제는 바인딩의 데이터 흐름 방향에 대한 설명 입니다. 샘플 프로젝트는 전체 수입에서 지출 내역이 변경 되었을 경우 남은 금액을 계산하는 프로젝트 입니다. 바인딩 객체 정의 TotalIncome, Food, Misc, Rent, Savings 속성을 가지고 있는 NetIncome 객체를 생성 합니다. 속성 변경 알림을 위해 INotifyPropertyChanged를 구현하며 총 수입에서 총 지출액을 뺀 나머지를 계산하는 UpdateSavings 메서드를 구현 합니다. 1: using System; 2: using System.Collections.Generic; 3: using System.ComponentModel; 4: using System.Linq; 5: using System.Text; 6: using System.Threading.Tasks; 7: namespace DirectionalBinding 8: { 9: public class NetIncome : INotifyPropertyChanged 10: { 11: private int _food; 12: private int _misc; 13: private int _rent = 2000; 14: private int _savings; 15: private int _totalIncome = 5000; 16: public int Food 17: { 18: get 19: { 20: return _food; 21: } 22: set 23: { 24: if (Food != value) 25: { 26: _food = value...

MSDN WPF 샘플 따라하기 - MultiBinding

이미지
MultiBinding 이 예제는 여러 값을 바인딩 하는 방법과 바인딩 된 여러 값을 변환 처리 하는 방법에 대해 설명 합니다. 아래 이미지는 ListBox의 아이템을 선택 시 Normal Format, LastNameFirst Format 항목의 값이 동시에 변환 되는도록 구성되어 있습니다. 사용자 정의 객체 정의 먼저, 바인딩에 필요한 FistName, LastName 속성을 포함하는 PersonName 객체와 이름 저장할 수 있는 NameList 컬렉션 객체를 정의 합니다. 1: public class PersonName 2: { 3: public PersonName(string first, string last) 4: { 5: FirstName = first; 6: LastName = last; 7: } 8: public string FirstName { get; set; } 9: public string LastName { get; set; } 10: } 1: public class NameList : ObservableCollection<PersonName> 2: { 3: public NameList() 4: { 5: Add(new PersonName("Willa", "Cather")); 6: Add(new PersonName("Isak", "Dinesen")); 7: Add(new PersonName("Victor", "Hugo")); 8: Add(new PersonName("Jules", "Verne")); 9: } 10: } ...

MSDN WPF 샘플 따라하기 - BindConversion

이미지
BindConversion Converter는 원본과 대상이 서로 다른 데이터 형식을 갖고 있거나 일부 변환이 필요한 경우 원본과 대상 사이의 다리 역할을 합니다. 바인딩 시 데이터를 변환 하려면 Convert 및 ConvertBack 메서드를 포함하는 IValueConverter 인터페이스를 구현 해야 합니다. 이 예제는 날짜 타입 데이터가 바인딩 속성 타입에 따라 Brushes 또는 날짜 시간 문자열로 변환하는 역할을 하는 Converter를 구현 합니다. DateTime 속성을 가진 클래스를 정의 합니다. 1: public class MyData : INotifyPropertyChanged 2: { 3: private DateTime _thedate; 4: public DateTime TheDate 5: { 6: get { return _thedate; } 7: set { _thedate = value; } 8: } 9: public MyData() 10: { 11: _thedate = DateTime.Now; 12: } 13: public event PropertyChangedEventHandler PropertyChanged; 14: protected void OnPropertyChanged(string propertyName) 15: { 16: PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 17: } 18: } IValueConverter 인터페이스를 구현 합니다. 1: public class MyConverter : IValueConverter 2: { 3: public obje...

MSDN WPF 샘플 따라하기 - BindingDPToDP

이미지
BindingDPToDP WPF의 종속성 속성을 종속성 속성에 바인딩이 가능 합니다. 이번 예제는 ComboBox의 SelectedItem 속성이 Canvas의 Background 속성에 바인딩을 되어 SelectedItem 속성에 변경이 있을 때 Canvas.Background 속성에 자동으로 적용 되는 것을 볼 수 있습니다. ComboBoxItem에 색상의 문자열을 추가 합니다. 1: <ComboBox Name="myComboBox" SelectedIndex="0"> 2: <ComboBoxItem>Green</ComboBoxItem> 3: <ComboBoxItem>Blue</ComboBoxItem> 4: <ComboBoxItem>Red</ComboBoxItem> 5: </ComboBox> Canvas.Background 속성에 ComboBox의 SelectedItem.Content를 바인딩 합니다. 1: <Canvas> 2: <Canvas.Background> 3: <Binding ElementName="myComboBox" Path="SelectedItem.Content" /> 4: </Canvas.Background> 5: </Canvas> ElementName 속성을 통해 연결 할 Element를 지정하고, Path 속성을 통해 참조 할 속성을 지정합니다. Winform 이었다면 ComboBox의 SelecteChanged 이벤트를 통해 코드를 작성해야 했지만 WPF는 추가 작업 없이 간단하게 구현이 가능 합니다.

MSDN WPF 샘플 따라하기 - PropertyChangeNotification

이미지
PropertyChangeNotification OneWay 또는 TwoWay 바인딩을 지원하여 바인딩 대상 속성이 자동으로 바인딩 소스의 동적 변경 사항을 반영 하도록 하려면 클래스가 적절한 속성 변경 알림을 제공하는 INotifyPropertyChanged 또는 ObservableCollection<T>를 상속받아 구현해야 합니다. 이번 예제는 ItemsControl을 이용해 컬렉션을 표현하며, DataTemplate를 이용해 항목의 모양을 설정 합니다. 컬렉션 개체는 타이머를 통해 속성 값을 주기적으로 업데이트 하고 바인딩 된 값이 UI에 반영되는 것을 볼 수 있습니다. INotifyPropertyChanged를 구현하는 클래스를 정의 합니다. 1: public class Bid : INotifyPropertyChanged 2: { 3: private string _bidItemName; 4: private decimal _bidItemPrice; 5: public string BidItemName 6: { 7: get { return _bidItemName; } 8: set 9: { 10: if (_bidItemName != value) 11: { 12: _bidItemName = value; 13: // 속성이 업데이트 될 때마다 OnPropertyChanged를 호출합니다. 14: OnPropertyChanged("BidItemName"); 15: } 16: } 17: } 18: public decimal BidItemPrice 19: { 20: get { return _bidItemPric...

MSDN WPF 샘플 따라하기 - Simple Binding

이미지
Simple Binding 따라하기 사용자 정의 클래스의 속성 값이 변경 되었을 때 UI 엘리먼트에 바인딩 되어 있는 속성 값이 동일한 시점에 변경 되는 예제 입니다. TextBox의 Text 속성이 변경되면 TextBlock의 Text 속성이 동일한 값으로 변경되는 예제 사용자 정의 객체 Person 선언 1: /// <summary> 2: /// 이 클래스는 단방향 및 양방향 바인딩을 지원하기 위해 INotifyPropertyChanged를 구현합니다 3: /// (소스가 동적으로 변경되면 UI 요소가 업데이트 됨) 4: /// </summary> 5: public class Person : INotifyPropertyChanged 6: { 7: private string _name; 8: public Person() { } 9: public Person(string value) 10: { 11: _name = value; 12: } 13: public string PersonName 14: { 15: get { return _name; } 16: set 17: { 18: // 속성이 업데이트 될 때마다 OnPropertyChanged 호출 19: if (_name != value) 20: { 21: _name = value; 22: OnPropertyChanged("PersonName"); 23: } 24: } 25: } 26: // 이벤트 선언 27: public event PropertyChangedEventHa...