2014-11-13 1 views
2

winforms 인터페이스에서 데이터 바인딩을 위해 클래스의 속성에서 사용자 지정 특성을 사용하려고했습니다. 예를 들어 잘못된 데이터가있는 텍스트 상자에서 배경색, 시작 색상 및 툴팁을 설정하고 변경합니다. BackColorAttr과 같은 클래스의 속성을 아무 문제없이 이름을 지정하는 등의 사용자 지정 특성에 대해 backcolor 등의 txtTest 컨트롤 속성을 바인딩 할 수 있습니다. 속성 값 자체는 텍스트 상자의 텍스트에 바인딩되어 있으며, 양방향 바인딩은 잘 작동하며 초기 배경색, forecolor 등은 내가 원하는 방식으로 초기 특성 값에서 설정됩니다. 모든 코딩을 몇 가지 일반적인 메서드로 축소하는 BindingHelper 클래스를 통해이 모든 작업을 수행하고 있습니다.vb.net 클래스의 사용자 지정 특성 값 수정

여기 저기 난처한 부분은 나중에 사용자 지정 특성 값을 조작하는 것입니다. 예를 들어 배경색을 빨간색으로 변경합니다. 내가 시도한 것은 아무것도 작동하지 않는 것 같습니다. 아무도 이런 식으로 해본 적이 있습니까? 아니면 내가 어떻게 진행할 지에 대한 지침이 있습니까?

+3

지금까지 시도한 것을 보여줄 수 있습니까? – waka

+0

속성의 속성은 읽기 전용입니다. 런타임에 변경할 수 있더라도 INotifyPropertyChanged 인터페이스를 지원하지 않으므로 바인딩을 통해 이러한 특성에 바인딩 된 값이 새로 고쳐지지 않습니다. – Steve

+0

@Steve : 이것은 WinForms이므로 INotifyPropertyChanged 인터페이스가 없습니다. - 최소한 네이티브 적으로. –

답변

0

저는 첫 번째 부분을 따르거나 색이나 속성과 어떤 관련이 있습니까?하지만 Attributes이 작동하지 않는 것은 아닙니다. 속성 래퍼가 아니며 Properties, MethodsTypesAttributes과 관련이 없습니다 (및 , 그 반대로). 그것들은 어셈블리에 컴파일 된 메타 데이터입니다. 따라서 의미있는 방식으로 값을 변경할 수 없습니다.

테스트 클래스 및 테스트 속성 :

Dim f As New Foo 

' get props for the Type 
Dim pi As PropertyInfo = f.GetType.GetProperty("Name") 

Dim attr = pi.GetCustomAttributes(GetType(BarState), False) 

If attr.Length > 0 Then 
    ' get prop info for the State property on the Attr Type 
    Dim pa As PropertyInfo = attr(0).GetType.GetProperty("State") 
    ' change it 
    CType(attr(0), BarState).State = "GREEN" 
    ' or 
    'pa.SetValue(attr(0), "GREEN", Nothing) 

    ' print it (prints "GREEN" but it does not persist) 
    Console.WriteLine(CType(attr(0), BarState).State) 
End If 

'get the attr again as you might do next time thru 
attr = pi.GetCustomAttributes(GetType(BarState), False) 
' print the value (Print "red") 
Console.WriteLine(CType(attr(0), BarState).State) 

첫 번째 인쇄는 "GREEN"입니다하지만만을위한 것입니다 : State 이후

Public Class BarState 
    Inherits Attribute 

    Public Property State As String 

    Public Sub New(t As String) 
     State = t 
    End Sub 
End Class 

Public Class Foo 

    <BarState("red")> 
    Public Property Name As String 

End Class 

는 속성입니다 테스트 우리가 설정할 수있는 경우 이 인스턴스는 지속되지 않습니다. 다음 번에 가져 오면 "빨간색"으로 되돌아갑니다. 속성 이 유형이이기 때문에 Reflection을 시도하여 pa.SetValue(attr(0), "GREEN", Nothing)을 사용하여 값을 변경하고 주석 처리 할 수 ​​있습니다. "빨간색"이 어셈블리에 컴파일되어 시작점이 항상 존재하기 때문에 계속 유지되지 않습니다.

모든 유형의 모든 속성에 대한 사전 또는 속성 인스턴스 모음을 유지하는 것처럼 보일 수 있습니다. 그것들은 모두 똑같이 작동 할 수 있습니다. 따라서 어떤 것도 Attribute 인스턴스가 어떤 Property에있는지를 추적하기 위해 해시를 만들어야합니다. Type.

그리고 그 컬렉션을 기본 인스턴스 개체와 동기화 상태로 유지해야합니다. Attribute 인스턴스는 그 인스턴스가 사라 졌음을 알지 못하므로 상태 설정이 되돌려 져야하므로 Attribute Manager가이를 처리해야합니다.


당신은 (값의 범위 등) 일에 태그를 다음 태그 속성에 대한 범위 검사에서 직조하는 어셈블리를 다시 작성하는 속성 사용 "직공"로 보일 수 있습니다

. 그들이 당신이 묘사하는 것의 라인을 따라 무엇을 할 지 알지 못한다면 당신이 무엇인지와 같은 소리가 나옵니다.

+0

OK, thanks, 여러분. 마치 벽돌을 물색하는 것처럼 보입니다. LOL. Plutonix, 나는 실제로 VB6에서 당신이 제안한 것과 비슷한 것을 거의 했었습니다. 생성 된 레코드 세트를 사용하여 인터페이스 항목을 유지 한 다음 해당 값에서 인터페이스를 조작합니다. 멋지게 일했습니다. 모든 코드가 캡슐화되었습니다. yada yada yada. 그 작업의 일부는 내가 조작하고 싶은 컨트롤 속성을 정의하는 것이었기 때문에 모든 작업을하지 않고 .NET에서 비슷한 것을하려고했습니다. :-) – ncscoots

+0

속성 변경 알림을 제공하는 [Fody] (https://github.com/Fody/PropertyChanged)와 같은 직조자를 조사하십시오. 이것은 당신이 원하는 것을 많이 할 수있는 이벤트를 제공합니다. 또한 무료 버전이있는 상업용 버전도 있습니다. – Plutonix

+0

또한 명확한 사항이있는 경우 체크 표시를 클릭하여 [대답하지 않은 목록] (http://stackoverflow.com/help/someone-answers)에서 해제해야합니다. – Plutonix

관련 문제