속성의 기본값은 속성의 유효성을 보장할 수 있습니다.
속성 검증 유효성은 입력 속성 및 속성 필수 콜백을 검증하는 데 사용될 수 있습니다. 즉, 속성 변경 여부에 관계없이 알림이 이루어져야 합니다.
속성 변경 알림, 속성이 변경되면 일련의 프로세스를 수행하도록 프로그램에 알림을 보낼 수 있습니다.
여기서는 WPF에 아무런 문제가 없습니다. 종속성 속성이 위의 문제를 어떻게 해결하는지 살펴보겠습니다.
콘텐츠 요약은 첫 번째이자 가장 간단한 종속성 속성 종속성 속성 값 기본 작업 속성 래퍼 속성 메타데이터(PropertyMetadata)를 정의합니다.
속성 메타데이터 기본 동작
MSDN의 원래 단어는 무뚝뚝하지만 그 정확성에는 의심의 여지가 없습니다. 일단 이해하고 나면 보면 다른 경험을 하게 될 것입니다.
1. 첫 번째이자 가장 간단한 종속성 속성을 정의합니다.
MSDN 원본: WPF(Windows Presentation Foundation)는 CLR(공용 언어 런타임) 속성의 기능을 확장하는 데 사용할 수 있는 서비스 집합을 제공합니다. 이러한 서비스를 통칭하여 WPF 속성 시스템이라고 하는 경우가 많습니다. WPF 속성 시스템에서 지원하는 속성을 종속성 속성이라고 합니다.
다음과 같이 연령 종속성 속성을 정의해 보겠습니다.
공개 클래스 DPCustomPeople
{
공개 정적 읽기 전용 종속성 속성 AgeProperty =
종속성Property.Register("Age", typeof(int), typeof(DPCustomPeople));
공공 무효 DisplayAgeProperty()
{
Console.WriteLine("DPName:" + DPCustomPeople.AgeProperty.Name);
Console.WriteLine("DPPropertyType:" + DPCustomPeople.AgeProperty.PropertyType);
Console.WriteLine("DPOWnerType:" + DPCustomPeople.AgeProperty.OwnerType);
}
}
그런 다음 출력 결과를 호출하십시오.
수업 프로그램
{
정적 무효 Main(string[] args)
{
DPCustomPeople 사람 = 새로운 DPCustomPeople();
people.DisplayAgeProperty();
}
}
종속성 속성 클래스에 익숙하지 않을 수 있습니다. 종속성 속성 클래스는 종속성 속성의 몇 가지 기본 특성을 제공합니다.
종속성 속성을 등록하는 방법은 여러 오버로드된 메서드를 제공하는 종속성 속성의 정적 Register 메서드를 호출하는 것이지만, 등록이 완료되면 다음 세 단계가 필요합니다.
등록된 이름(이름) "나이"를 입력하세요.
등록 속성 유형(PropertyType) typeof(int)
종속성 속성의 소유자 유형(OwnerType) 유형(DPCustomPeople)을 등록합니다.
참고: 속성 이름, 속성 유형 및 속성 소유자 유형은 일단 등록되면 변경할 수 없습니다.
다음은 출력 결과이다
2. 종속속성값의 기본 동작(값 획득 및 할당)
Age 종속성 속성을 정의한 후에는 속성에 대한 값 획득 및 할당 작업을 수행할 수 있어야 합니다. 종속성 속성 자체는 이러한 작업을 제공하지 않지만 종속성 객체에 의해 처리됩니다.
종속성 개체는 종속성 속성 시스템에 참여하는 개체를 나타냅니다.
따라서 정의된 클래스는 종속성 개체에서 상속한 다음 DPCustomPeople을 다시 작성해야 합니다.
공개 클래스 DPCustomPeople:System.Windows.DependencyObject
{
}
기본 값 할당 작업 GetValue 및 SetValue 메서드
공공 무효 DPPropertyBasicOperator()
{
Console.WriteLine("나이:" + this.GetValue(DPCustomPeople.AgeProperty));
this.SetValue(DPCustomPeople.AgeProperty, 24);
Console.WriteLine("ChangedAge:" + this.GetValue(DPCustomPeople.AgeProperty));
}
출력 결과
3. 속성 래퍼는 GetValue 및 SetValue 메서드를 사용하여 값에 대해 작업을 수행하므로 이를 래핑하고 Age 속성을 정의할 수 있습니다.
공개 연령
{
get { return (int)GetValue(AgeProperty) }
set { SetValue(AgeProperty, 값) }
}
참고: 종속 속성 패키징의 명명 규칙은 다음 속성을 제거하는 것입니다.
공공 무효 DPPropertyBasicOperatorUsingProperty()
{
Console.WriteLine("나이:" + this.Age);
this.나이=24;
Console.WriteLine("ChangedAge:" + this.Age);
}
위 코드가 좀 더 간결해 보이죠?
4. 속성 메타데이터(PropertyMetadata)
MSDN 원본: WPF(Windows Presentation Foundation) 속성 시스템에는 리플렉션 또는 일반 CLR(공용 언어 런타임) 기능을 통해 속성에 대해 보고할 수 있는 항목으로 제한되지 않는 메타데이터 보고 시스템이 포함되어 있습니다.
속성 메타데이터에 관해 말하면 가장 먼저 떠오르는 것은 .net의 속성입니다.
공개 클래스
{
[DefaultValue(200),Category("레이아웃")]
공개 int 너비 { 설정 }
}
특성은 Visual Studio의 강력한 기능을 사용하여 IDE에서 특성을 쉽게 지원하도록 하거나 리플렉션을 사용하여 값을 할당해야 합니다.
그러나 이러한 기술이 없으면 new는 일반 채널을 통해 새 인스턴스를 생성하고 속성을 추가해도 효과가 없습니다. 속성의 일부 기본 특성(예: 기본값)을 보장할 수는 없습니다. 속성은 위에서 설명한 메타데이터와 다릅니다.
종속성 속성에 대한 메타데이터
종속성 속성이 정의된 클래스에 의해 고유하게 지정될 수 있습니다. 종속성 속성이 다른 클래스에 추가될 때 변경될 수 있습니다. 정의하는 기본 클래스에서 종속성 속성을 상속하는 모든 파생 클래스에 의해 명시적으로 재정의될 수 있습니다. 위의 언어는 무뚝뚝합니다. 하지만 처음에는 디자이너의 생각을 항상 이해할 수는 없습니다. 이 개념의 존재를 먼저 알아보세요.
5. 속성 메타데이터의 기본 동작 속성 메타데이터의 기본 동작은 종속 속성에 대해 세 가지 기능을 제공합니다. 이는 이 기사에서 방금 제기한 문제이기도 합니다.
기본 속성 속성 알림 속성 필수 콜백 먼저 전체 PropertyMetadata의 생성자를 살펴보겠습니다. 기본 PropertyMetadata가 종속 속성에 대해 설정되지 않은 경우 PropertyMetadata 개체가 종속 속성에 대해 내부적으로 자동으로 생성됩니다.
공용 PropertyMetadata(개체 defaultValue, PropertyChangedCallback propertyChangedCallback, CoerceValueCallback coerceValueCallback)
종속 속성은 속성 메타데이터 개념을 빌려 속성 기본값, 속성 알림, 강제 콜백 및 기타 동작을 완료합니다.
1.속성 기본값
공개 정적 읽기 전용 종속성속성 이름속성 =
종속성Property.Register("이름", typeof(문자열), typeof(DPCustomPeople),
새로운 PropertyMetadata(string.Empty));
대부분의 사람들은 이것을 보고 질문을 할 것입니다. 왜 PropertyMetadata를 사용하여 기본값을 Register 메소드에 직접 등록하지 않습니까?
공개 정적 읽기 전용 종속성속성 이름속성 =
종속성Property.Register("이름", typeof(문자열), typeof(DPCustomPeople),
문자열.비어 있음);
물론, 이 질문은 오랫동안 저와 함께 있었고, 그것을 해결하지 못하면 제가 할 수 있는 일이 없기 때문에 일단은 놔두겠습니다.
참고: PropertyMetadata의 속성에 기본값을 할당하면 유형 정확성을 감지할 수 없습니다.
이러한 정의는 vs의 dp 코드 세그먼트의 기본값이 0이므로 주목할 가치가 있습니다.
공개 정적 읽기 전용 종속성속성 이름속성 =
종속성Property.Register("이름", typeof(문자열), typeof(DPCustomPeople),
새로운 UIPropertyMetadata(0));
2. 속성 기본값 복원 작업
속성에 값이 할당된 후 다음 코드에 표시된 것처럼 종속성 개체의 ClearValue 메서드를 통해 기본값을 복원할 수 있습니다.
공개 문자열 이름
{
get { return (string)GetValue(NameProperty) }
set { SetValue(이름속성, 값) }
}
공개 정적 읽기 전용 종속성속성 이름속성 =
종속성Property.Register("이름", typeof(문자열), typeof(DPCustomPeople),
새로운 UIPropertyMetadata(string.Empty));
공공 무효 DPPropertyClearOperator()
{
Console.WriteLine("이름:" + this.Name);
this.Name="테리";
Console.WriteLine("ChangedName:" + this.Name);
this.ClearValue(NameProperty);
Console.WriteLine("이름:" + this.Name);
}
출력 결과
참고: 기본 할당과 기본값을 구별하세요.
기본 할당은 일반적으로 생성자에서 수행되지만 이는 특히 파생 클래스가 속성을 재정의하는 경우 기본값이 아닙니다(종속성 속성이 출현하기 전에는 사실이었습니다).
공개 수업 학생 : DPCustomPeople
{
공개학생()
{
this.Name = "하늘";
}
공공 무효 TestSubDefaultDpValue()
{
Console.WriteLine("이전 지우기:"+this.Name);
this.ClearValue(Student.NameProperty);
Console.WriteLine("다음 이후 지우기:" + this.Name);
}
}
출력 결과
3.재산변경 신고
이 함수는 가장 일반적으로 사용됩니다. 속성 값이 변경되면 PropertyChangedCallback 콜백이 트리거됩니다.
공개 bool IsBoy
{
get { return (bool)GetValue(IsBoyProperty) }
set { SetValue(IsBoyProperty, 값) }
}
공개 정적 읽기 전용 종속성 속성 IsBoyProperty =
종속성Property.Register("IsBoy", typeof(bool), typeof(학생),
new UIPropertyMetadata(false,new PropertyChangedCallback(IsBoyPropertyChangedCallback)));
공개 정적 무효 IsBoyPropertyChangedCallback(DependencyObject d, 종속성PropertyChangedEventArgs e)
{
학생 st = 학생으로서의 d;
if (st.IsBoy)
{
Console.WriteLine("안녕하세요,소년");
}
또 다른
{
Console.WriteLine("안녕하세요, 아가씨");
}
}
공공 무효 TestPropertyChangedCallback()
{
this.IsBoy = 거짓;
this.IsBoy = 참; this.IsBoy = 참;
}
종속성PropertyChangedEventArgs를 통해 이전 값과 새 값 출력 결과를 볼 수 있습니다.
메모:
(1) 위의 출력 결과를 통해 종속 속성의 기본값이 속성 변경 알림을 트리거하지 않는다는 것을 보셨나요?
(2) 속성 변경 알림을 수동으로 트리거합니다.
속성 변경을 트리거하기 위해 기본값을 원하는 경우(실제로 꼭 필요한 경우도 있음) 수동으로 트리거할 필요가 없습니다.
개인 무효 raiseIsBoyPropertyChangedCallback()
{
IsBoyPropertyChangedCallback(this,new 종속성PropertyChangedEventArgs
(학생.IsBoyProperty, Student.IsBoyProperty.DefaultMetadata.DefaultValue, null));
}
(3) 속성 변경 알림이 있는 경우 속성 기본값 유형이 올바른지 확인하세요.
값 유형에는 기본값이 있지만 참조 유형에는 없다는 것을 알고 있습니다(즉, null에 할당될 수 있음). 기본 유형이 있는지 여부는 아래와 같이 default 키워드를 사용하여 확인할 수 있습니다.
위에서 정의한 종속성 속성의 기본값을 null로 다시 작성합니다. PropertyChangedCallback이 없으면 잘 실행될 수 있지만 속성 변경 알림이 있으면 재난이 발생하고 프로그램에서 형식이 맞지 않는다고 예외가 발생합니다. 성냥.
공개 정적 읽기 전용 종속성 속성 IsBoyProperty =
종속성Property.Register("IsBoy", typeof(bool), typeof(학생),
new UIPropertyMetadata(null,new PropertyChangedCallback(IsBoyPropertyChangedCallback)));
참조 유형을 다시 살펴보겠습니다. 기본값이 null이면 모든 것이 정상입니다.
공개 IList LovedGirl
{
get { return (IList)GetValue(LovedGirlProperty) };
set { SetValue(LovedGirlProperty, 값) }
}
공개 정적 읽기 전용 종속성 속성 LovedGirlProperty =
종속성Property.Register("사랑하는 소녀", typeof(IList), typeof(학생),
new UIPropertyMetadata(null, new PropertyChangedCallback(LovedGirlChangedCallback)));
공개 정적 무효 LovedGirlChangedCallback(DependencyObject d, 종속성PropertyChangedEventArgs e)
{
학생 st = 학생으로서의 d;
foreach(e.NewValue의 var 항목을 IList로)
{
Console.WriteLine(항목);
}
}
공공 무효 TestReferenceDpType()
{
List<string> 목록 = 새 List<string>();
list.Add("소녀 1");
list.Add("여자 2");
this.LovedGirl = 목록;
}
4. 강제 속성 콜백
우선, 기본값은 여전히 콜백 메소드를 트리거하지 않습니다.
강제 콜백 방식이란 속성값의 변경 여부와 상관없이 콜백 방식이 진입한다는 의미이다.
공개 정수 점수
{
get { return (int)GetValue(ScoreProperty) }
set { SetValue(ScoreProperty, 값) }
}
공개 정적 읽기 전용 종속성 속성 점수 속성 =
종속성Property.Register("점수", typeof(int), typeof(학생),
new UIPropertyMetadata(0,null,new CoerceValueCallback(ScoreCoerceValueCallback)));
공용 정적 객체 ScoreCoerceValueCallback(DependencyObject d, object baseValue)
{
Console.WriteLine(baseValue);
기본 값을 반환합니다.
}
공공 무효 TestCoerceValueCallback()
{
this.점수 = 0;
this.점수 = 0;
this.점수 = 0;
}