안녕하세요.
이번 포스팅에서는 사용자 지정 Attached Property에 대해 이해와, 예제를 다룹니다.

1. 다른건 다 기본 내용을 쓰고싶은데, 이거 하나만 추가하고싶어,,

예를 들어서, ListBox에서 여러개를 선택가능하게 하되, 최대갯수를 제한하고 싶은 경우를 봅시다.
기본의 ListBox에서는 MultiSelect를 할수있게/없게 하는 기능은 있어도, 최대 갯수를 지정할 수는 없습니다.
이를 구현하는데 쉽게 생각할 수 있는 방법은 상속입니다. 부모의 기능은 그대로 사용하고 싶은데, 내것 하나만 추가됬으면 하는 경우 니까요


상속을 이용한 MultiSelectionCount 구현

하지만, 이렇게 구현하게되면 하나의 프로퍼티 때매, 전체를상속 받아야 하며,  새로 구현한 아이만을 사용해서 구현하여야 합니다.
좀 더 효과적으로 구현할 수 있는 방법이 있까요?!
이번 포스팅에서 설명하고하 하는 사용자 지정 Attached property를 사용하면 됩니다.

우선
사용자 지정 Attached property를 설명하기 앞써, 사용자 지정을 뺀 Attached property에 대해 이야기 해봅시다.

2.  Attached property란?
    Attacted Property란 어떤 객체에서든지 설정할 수 있는 global한 속성입니다. 
    보통의 경우 부모요소에 포함된 값을 부모가 직접 지정할 수는 없고,  자식요소가 지정해야할 경우에 사용할 수 있도록 해줍니다.
    그러기 위해서  global하게 구현이 되어 있고요.   
    먼가 말로 표현하니 어렵게 느껴지는데요, 평소에 많이 사용하던 Property로 예제를 보면 무릎을 탁 치시게 될꺼에요.


평소에도 많이 사용하는 Attatced Property.  (DockPanel.Dock)
  
즉, 여기서 DockPanel.Dock속성은 부모인 DockPanel에서 정할 수 있는 것이 아니라,
DockPanel안에 포함되는 자식 요소에서 설정되어야 하기 때문에, DockPanel 클래스 안에서는 DockProeperty를 static Dependency Property로 만든 다음 GetDock과 SetDock Metheod를 public으로 제공합니다.



바로 이게 정의는 내가하나, 남들이 정의해서 써야할때-_-!! 사용하는 것이 Attached Property입니다. 
평소에도 사용하시면서 보셨거죠?
 
자 , 그럼 본론으로 들어가 봅시다.

3.  사용자 지정 Attacted Property란?

 위에서 구현하고자 했었던 ListBox에서 여러개를 선택가능하게 하되, 최대갯수를 제한하려고 해 봅시다.
 바로 이 Attacted Property를 이용해서 말이지요. 

 다음과 같이 구현하면 됩니다.


사용자 정의 Atteched Property를 사용할 경우

* 10원 팁 : 아래와 같이 propa를 치게되면 인텔리센스가 적당히 atteched Property를 생성하는것을 도와줍니다.




4. 사용을 해보자.

xaml에서 그럼 실제로 구현한 내용을 적용해 봅시다.


사용자 정의 Attacted Property를 사용할 경우 vs ListBox를 상속받아 구현할 경우 사용

* 별첨


C#코드에서 사용자 정의 Property를 사용하는 방법

어찌보면 extention method 와 비슷하다고 보실 수 있네요.

전체 예제는 아래에 첨부합니다.




저작자 표시
신고

Introduction

이번시간에는 "찌니남편"님께서 방명록을 통해 질문해주신 내용대로, 네트워크 상의 컴퓨터 목록을 가져오는 방법에 대해 소개합니다. 윈도우를 제어하는 작업이다보니 이를 구현하는 방법은 다양하지만 이번시간에는 간단히 .Net Framework상에서 제공하는 기능들을 이용해 네트워크 상에 존재하는 컴퓨터이름, 아이피주소, 연결상태등을 확인하는 방법에 대해 설명드리겠습니다. 아래는 이번시간에 구현할 내용의 결과물 이미지 입니다.

Using Active Directory Services Interfaces

Active Directory Service Interfaces(ADSI)는 여러 네트워크 공급업체들이 제공하는 다양한 디렉터리 서비스의 기능을 이용해 네트워크 자원을 관리하는 디렉터리 서비스 인터페이스 집합으로, 간단하게 네트워크 디렉토리에 접근하고 제어 할 수 있도록 돕습니다. .Net Framework에서도 System.DirectoryServices 네임스페이스를 통해 ADSI를 사용할 수 있기 때문에, 이번시간에는 이를 통해 구현해보도록 하겠습니다.

※ System.DirectoryServices 네임스페이스는 System.DirectoryServices어셈블리를 참조 추가 한 뒤 사용할 수 있습니다.

사용법은 매우 간단합니다. WinNT를 이용해 네트워크영역을 DirectoryEntry를 생성하고 Workgroup을 탐색해가며 네트워크 상에 연결된 컴퓨터의 목록을 가져올 수 있습니다. 아래는 소스코드입니다.


위 코드를 간단히 설명하면, DirecotryEntry를 이용해 네트워크상의 컴퓨터 이름을 가져온뒤 DNS를 이용해 해당 컴퓨터의 IP주소 목록을 가져옵니다. 그리고 Ping을 통해 대상 컴퓨터의 상태와 응답속도를 확인합니다. 소스가 크게 복잡하지 않기 때문에 코드에 대한 설명은 여기까지로 하며, 혹시 더 궁금하신 부분이나 문의 사항은 이메일이나 댓글로 남겨주시면 답변드리도록 하겠습니다.

신고

Introduction

ERP 관련 Application을 제작할때 자주 사용되는 컨트롤 중의 하나가 ListView입니다. 많은 양의 데이터를 손쉽게 출력하기에는 용이하지만 컨트롤 자체적으로 데이터의 정렬이나 필터링등의 기능을 제공하고 있지 않기 때문에 이부분을 직접 구현하거나 상용 컴포넌트를 구입해서 사용해야 합니다. 이번시간에는 ListView의 Column을 클릭해 데이터를 정렬하거나 필터링 하는 방법에 대해 소개합니다. 아래는 이번시간에 구현하게 될 내용의 데모 동영상입니다.

이번 예제의 경우 한번의 포스팅에서 다루기 힘든 양의 소스코드이기 때문에 이번시간에는 기본적인 부분만 설명하고 나머지 부분은 추후 다시 포스팅을 하거나 소스코드를 보시고 이해가 안되신다고 하시는 부분을 위주로 먼저 설명 드리겠습니다.

ListView Sorting

ListView의 데이터를 정렬하기 위해서는 CollectionView의 SortDescriptions을 이용합니다. ListBox나 ListView와 같이 ItemsPresenter를 사용하는 컨트롤의 경우 화면에 출력될때 CollectionView를 이용해 출력될 데이터를 구성하는데 이때 SortDescription을 지정해주면 간단하게 데이터를 정렬 할 수 있습니다. 아래는 정렬 기준 속성이름과 정렬방향 그리고 ItemsSource를 통해 화면에 출력될 데이터를 정렬하는 방법입니다.

ListView Filtering

데이터 필터링도 마찬가지로 CollectionView를 이용해 간단히 구현 할 수 있습니다. CollectionView에는 Predicate<object>형식의 대리자를 통해 해당 요소가 화면에 출력될 때 필터링 되야 하는지 여부를 결정하는데 하나의 Predicate<object>에서 여러개의 필터링 규칙을 지정하는 것은 효율적이지 않기 때문에 아래와 같은 PredicateList<T>를 생성해 여러 상황의 Filtering 기준을 지정 할 수 있습니다.


아래는 이번시간에 사용된 전체 소스코드입니다.

※ 이번 시간 이후로 등록되는 포스팅의 소스코드를 열기 위해서는 VisualStudio2010버전이 필요합니다.

신고

코디네이터 베타로 구현한 WPF, Silverlight UI Theme 디자인.
모든 기본 UI 콘트롤에 적용 가능합니다.


신고

Introduction

C# 에서의 이벤트는 해당 이벤트가 선언된 클래스에서만 호출할 수 있는 특수한 종류의 Multicast Delegate의 형태로서, 아래와 같이 이벤트가 정의된 클래스를 상속 받아 구현 했다 하더라도 이벤트를 직접 호출할 수 는 없습니다.


이를 해결하기 위한 일반적인 방법으로 아래와 같이 부모객체에 해당 이벤트를 호출 할 수 있는 메서드를 미리 정의 함으로서 이벤트를 호출 하는 방법을 사용합니다.


그런데 만약 부모의 소스코드에 접근 할 수 없는 상황(예: 라이브러리에서 제공하는 객체를 상속받아 구현하는 경우)이거나 외부객체의 이벤트를 강제로 호출하고자 할 경우에 여러가지 문제가 발생할 수 있습니다. 이번시간에는 외부 혹은 내부에 정의된 이벤트에 접근하고 해당 이벤트를 직접 호출하는 방법에 대해 소개합니다.

Create RaiseEventHelper

외부에서 정의된 이벤트를 호출하기전에 먼저 개발자가 이벤트를 정의 했을때 내부적으로 어떠한 변화가 있는지를 확인 해볼 필요가 있습니다. 먼저 아래와 같이 간단한 이벤트가 정의된 코드를 빌드한 후 Windows SDK에서 제공하는 IL DASM을 이용해 작성한 코드가 어떻게 변화 했는지 확인 해 보겠습니다.

왼쪽은 이벤트를 정의 하기 전의 어셈블리이며. 오른쪽이 위 코드를 빌드한 어셈블리입니다. 단순히 이벤트한줄만 추가했을 뿐인데 내부적으로 여러개의 멤버들이 추가로 생성된것을 확인 할 수있습니다.

추가된 항목중에 관심있게 살펴봐야 하는 것은 DummyEvent 필드로, 코드에서 정의한 이벤트와 같은 Delegate를 사용하고 이름까지 동일하는 것으로 보아 이벤트를 구독하거나 해지 할때 DummyEvent필드를 이용한다는것을 알 수 있습니다. 이제 이벤트가 생성되었을때 내부적으로 관리되는 Delegate가 어떻게 생성되는지 알았으므로 Reflection을 이용해 외부에서도 얼마든지 이벤트를 호출 할 수 있습니다.


간단히 코드를 설명하면 Target 객체에 EventName에 해당하는 Delegate를 검색하고 이를 구독하는 여러 메서드들을 직접 호출해주는것으로 이벤트를 호출하는것과 동일한 효과를 낼 수 있습니다. 그리고 실제 사용할 때에는 아래와 같이 사용할 수 있습니다.


이상으로 이번 포스팅을 마치며 기타 궁금하신점이나 다른 문의사항은 메일이나 댓글로 남겨주시면 답변드리도록 하겠습니다. 감사합니다.
 

신고