1

프로그램의 기본 개체를 특성화하는 사용자 지정 클래스가있는 응용 프로그램의 플러그 인을 작성하고 있습니다. API를 사용하면 키순 문자열을 원시 파일의 객체간에 직접 읽고 쓸 수 있습니다. 그렇다면 읽고 쓰는 각 속성의 Get 및 Set 접근 자에서 비공개 필드를 읽고 쓰는 것이 아니라 프로그램에서 기본 객체와주고받는 사용자 문자열을 쓰는 것입니다.기본 콜렉션 편집기 및/또는 사용자 정의 UIEditor가 속성에 대한 접근자를 지정하도록 할 수 있습니까?

사용자가 PropertyGrid 컨트롤을 통해 이러한 속성에 액세스합니다. 지금까지는 사용자 지정 개체 형식 (Floor)의 사용자 지정 컬렉션 (FloorCollection)을 저장해야하는 것을 제외하고는이 모든 것이 간단한 속성으로 잘 작동합니다.

그래서 XmlSerializer을 사용하여 속성을 설정했습니다. GET 접근자는 네이티브 개체에서 사용자 문자열을 읽은 다음 문자열을 FloorCollection의 인스턴스로 deserialize합니다. SET 접근자는 FloorCollection의 인스턴스를 읽고 사용자 문자열에 직렬화하여 역순으로 수행합니다. 나는 기본 컬렉션 편집기 내 PropertGrid을 통해이 컬렉션 속성을 열 수 있습니다

public FloorCollection Floors 
{ 
    get 
    { 
     string oldString = this.GetBaseObjUserString("CPFloors"); 
     if (oldString == null) return null; 

     XmlSerializer serializer = new XmlSerializer(typeof(FloorCollection)); 
     StringReader strReader = new StringReader(oldString); 

     FloorCollection newCollection =     
     (FloorCollection)serializer.Deserialize(strReader); 
     return newCollection; 
    } 

    set 
    { 
     FloorCollection newCol = value; 

     if (newCol == null) return; 

     //serializes new collection 
     XmlSerializer serializer = new XmlSerializer(typeof(FloorCollection)); 
     StringWriter sw = new StringWriter(); 

     serializer.Serialize(sw, newCol); 

     string newString = sw.ToString(); 

     this.SetBaseObjUserString("CPFloors", newString); 
    } 
} 

:

여기처럼 내 재산이 어떻게 표시되는지를 보여줍니다. 그러나 기본 콜렉션 편집기는 SET 접근자를 호출하여 개체에 다시 저장하는 대신 GET 접근자가 제공 한 참조에서 컬렉션을 편집하기 만합니다. 따라서 기본 편집기에서 컬렉션을 편집 할 수 있지만 편집기를 닫았다가 다시 열면 SET 접근자가 콜렉션을 원시 객체의 사용자 문자열로 다시 직렬화하기 위해 호출되지 않기 때문에 컬렉션이 변경되지 않습니다.

기본 컬렉션 편집기를 수정하여 속성의 접근자를 호출 할 수 있습니까? 내가 사용자 정의를 설치하면 UITypeEditor 속성이 속성 접근자를 사용하여 속성에 다시 저장하는 방법이 있습니까? 또는 GET 컬렉션 속성에 액세스하는 코드를 강제로 다른 방법으로 참조 대신 값으로 속성을 설정할 수 있습니까?

답변

0

XML 시리얼 화이버가 컬렉션 용 set 접근자를 호출 할 것이라고 생각하지 않습니다. 대신, 검색 한 컬렉션 인스턴스의 Add 메서드를 get 접근 자에서 호출합니다.

컬렉션 형식을 추가 및 제거 메서드를 재정의하고 컬렉션을 수정 한 다음 수정 된 컬렉션을 다시 사용자 속성으로 직렬화해야한다고 생각합니다.

+0

Hu? 너는 그것을 뒤로 가져왔다. set 접근자는 get 접근자가 deserialization이 일어나는 곳과 마찬가지로 직렬화가 일어나는 곳입니다. 문제는 기본 컬렉션 편집기 또는 사용자 정의 UITypeEditor를 사용하여 PropertyGrid를 통해 컬렉션을 편집 할 때 참조 컬렉션이 새 값을 직렬화하는 내 SET 프로세서를 통해 다시 전달되는 것이 아니라 직접 편집되는 것입니다. –

+0

아니요, 사실이에요. set 접근자가 결코 호출되지 않기 때문에 콜렉션이 변경 될 때마다 직렬화 할 특별한 콜렉션이 필요할 것이다. –

+0

글쎄 컬렉션 정말 변경되었을 때 직렬화 알 필요가 없습니다. 컬렉션을 사용하는 클래스는 콜렉션이 언제 다시 직렬화 될 수 있는지 알 필요가 있습니다. 내 사용자 정의 컬렉션은 BindingList 에서 상속되므로 구독 할 수있는 listchanged 이벤트가 있습니다. –

관련 문제