수색…
소개
종속성 속성은 CLR 속성을 확장하는 속성 유형입니다. 클래스의 멤버에서 CLR 속성을 직접 읽는 반면 기본 DependencyObject 클래스에서 상속을 통해 개체를 얻는 GetValue () 메서드를 호출하면 종속 속성이 동적으로 확인됩니다.
이 절에서는 종속성 속성을 분해하여 개념적으로나 코드 예제를 통해 사용법을 설명합니다.
통사론
- DependencyProperty.Register (문자열 이름, Type 속성 유형, 유형 ownerType)
- DependencyProperty.Register (문자열 이름, Type 속성 유형, 유형 ownerType, PropertyMetadata typeMetadata)
- DependencyProperty.Register (문자열 이름, 유형 propertyType, 유형 ownerType, PropertyMetadata typeMetadata, ValidateValueCallback validateValueCallback)
- DependencyProperty.RegisterAttached (문자열 이름, Type 속성 유형, 유형 ownerType)
- DependencyProperty.RegisterAttached (문자열 이름, Type 속성 유형, 유형 ownerType, PropertyMetadata typeMetadata)
- DependencyProperty.RegisterAttached (문자열 이름, 유형 propertyType, 유형 ownerType, PropertyMetadata typeMetadata, ValidateValueCallback validateValueCallback)
- DependencyProperty.RegisterReadOnly (문자열 이름, Type 속성 유형, 유형 ownerType, PropertyMetadata typeMetadata)
- DependencyProperty.RegisterReadOnly (문자열 이름, 유형 propertyType, 유형 ownerType, PropertyMetadata typeMetadata, ValidateValueCallback validateValueCallback)
- DependencyProperty.RegisterAttachedReadOnly (문자열 이름, Type 속성 유형, 유형 ownerType, PropertyMetadata typeMetadata)
- DependencyProperty.RegisterAttachedReadOnly (문자열 이름, 유형 propertyType, 유형 ownerType, PropertyMetadata typeMetadata, ValidateValueCallback validateValueCallback)
매개 변수
매개 변수 | 세부 |
---|---|
이름 | 프로퍼티 명의 String 표현 |
propertyType | 프롭퍼티의 Type typeof(int) |
소유자 유형 | 속성이 정의되는 클래스의 Type 입니다 typeof(MyControl) 예 : typeof(MyControl) 또는 typeof(MyAttachedProperties) . |
typeMetadata | 기본값, 속성 변경 콜백을 정의하는 System.Windows.PropertyMetadata (또는 해당 하위 클래스 중 하나)의 인스턴스 인 FrameworkPropertyMetadata 는 System.Windows.Data.BindingMode.TwoWay 와 같은 바인딩 옵션을 정의 할 수 있습니다. |
validateValueCallback | 속성의 새 값이 유효한 경우 true를 반환하는 사용자 정의 콜백이며, 그렇지 않으면 false입니다. |
표준 종속성 속성
언제 사용 하는가?
사실상 모든 WPF 컨트롤은 의존성 속성을 많이 사용합니다. 종속성 속성을 사용하면 스타일, 애니메이션, 데이터 바인딩, 값 상속 및 변경 알림을 지원하는 등의 표준 CLR 속성만으로는 불가능한 많은 WPF 기능을 사용할 수 있습니다.
TextBox.Text
속성은 표준 종속성 속성이 필요한 간단한 예제입니다. 여기서는 Text
가 표준 CLR 속성 인 경우 데이터 바인딩이 불가능합니다.
<TextBox Text="{Binding FirstName}" />
정의 방법
종속성 속성은 FrameworkElement
, Control
등과 같이 DependencyObject
에서 파생 된 클래스에서만 정의 할 수 있습니다.
구문을 기억하지 않고도 표준 종속성 속성을 만들 수있는 가장 빠른 방법 중 하나는 입력하여 "propdp"조각을 사용하는 것입니다 propdp
다음 탭을 누르면. 필요에 맞게 수정할 수있는 코드 스 니펫이 삽입됩니다.
public class MyControl : Control
{
public int MyProperty
{
get { return (int)GetValue(MyPropertyProperty); }
set { SetValue(MyPropertyProperty, value); }
}
// Using a DependencyProperty as the backing store for MyProperty.
// This enables animation, styling, binding, etc...
public static readonly DependencyProperty MyPropertyProperty =
DependencyProperty.Register("MyProperty", typeof(int), typeof(MyControl),
new PropertyMetadata(0));
}
속성 스 니펫, 속성 유형, 클래스 유형 및 기본값을 업데이트하는 것을 포함하여 필요한 변경을 수행하려면 코드 조각의 다른 부분을 탭 해야합니다.
중요한 규칙
다음은 몇 가지 중요한 규칙 / 규칙입니다.
종속성 속성에 대한 CLR 속성을 만듭니다. 이 속성은 개체의 코드 숨김 또는 다른 소비자에 사용됩니다.
GetValue
및SetValue
호출하여 소비자가 할 필요가 없도록해야합니다.종속성 속성의 이름을 올바르게 지정하십시오.
DependencyProperty
필드는public static readonly
여야합니다. CLR 속성 이름과 일치하고 "Property"로 끝나는 이름 (예 :Text
및TextProperty
합니다.CLR 속성의 설정자에 논리를 추가하지 마십시오. 종속성 속성 시스템 (및 XAML 구체적으로)은 CLR 속성을 사용하지 않습니다. 속성의 값이 변경 될 때 작업을 수행하려면
PropertyMetadata
를 통해 콜백을 제공해야합니다.public static readonly DependencyProperty MyPropertyProperty = DependencyProperty.Register("MyProperty", typeof(int), typeof(MyControl), new PropertyMetadata(0, MyPropertyChangedHandler)); private static void MyPropertyChangedHandler(DependencyObject sender, DependencyPropertyChangedEventArgs args) { // Use args.OldValue and args.NewValue here as needed. // sender is the object whose property changed. // Some unboxing required. }
바인딩 모드
바인딩에서 Mode=TwoWay
( TextBox.Text
의 동작과 유사)를 지정하지 않으려면 PropertyMetadata
대신 FrameworkPropertyMetadata
를 사용하고 적절한 플래그를 지정하도록 코드를 업데이트합니다.
public static readonly DependencyProperty MyPropertyProperty =
DependencyProperty.Register("MyProperty", typeof(int), typeof(MyControl),
new FrameworkPropertyMetadata(0, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
첨부 된 종속성 속성
언제 사용 하는가?
연결된 속성은 속성의 존재를 인식하는 다양한 컨트롤이나 서비스의 동작을 향상시키기 위해 모든 DependencyObject
에 적용 할 수있는 종속성 속성입니다.
첨부 된 속성의 일부 사용 사례는 다음과 같습니다.
- 부모 요소가 자식을 반복하고 특정 방식으로 자식을 처리합니다. 예를 들어,
Grid
컨트롤은Grid.Row
,Grid.Column
,Grid.RowSpan
및Grid.ColumnSpan
연결된 속성을 사용하여 요소를 행과 열로 정렬합니다. - 사용자 정의 템플릿을 사용하여 기존 컨트롤에 비주얼을 추가합니다. 예를 들어
TextBox
를 서브 클래스하지 않고도 빈 텍스트 상자에 워터 마크를 추가 할 수 있습니다. - 일부 또는 모든 기존 컨트롤 (
ToolTipService
또는FocusManager
일반 서비스 또는 기능 제공 이들은 일반적으로 부착 된 행동 이라고합니다. - 상속이 가능할 때, 예를 들어
DataContext
의 동작과 비슷하게 시각적 트리가 필요합니다.
Grid
사용 사례에서 어떤 일이 일어나는지를 보여줍니다.
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Content="Your Name:" />
<TextBox Grid.Column="1" Text="{Binding FirstName}" />
</Grid>
Grid.Column
은 Label
또는 TextBox
에있는 속성이 아닙니다. 오히려 Grid
컨트롤은 자식 요소를 살펴보고 연결된 속성 값에 따라 정렬합니다.
정의 방법
이 예제에서는 계속 Grid
를 사용합니다. 아래에 Grid.Column
의 정의가 나와 있지만 간결성을 위해 DependencyPropertyChangedEventHandler
가 제외되었습니다.
public static readonly DependencyProperty RowProperty =
DependencyProperty.RegisterAttached("Row", typeof(int), typeof(Grid),
new FrameworkPropertyMetadata(0, ...));
public static void SetRow(UIElement element, int value)
{
if (element == null)
throw new ArgumentNullException("element");
element.SetValue(RowProperty, value);
}
public static int GetRow(UIElement element)
{
if (element == null)
throw new ArgumentNullException("element");
return ((int)element.GetValue(RowProperty));
}
연결된 속성은 다양한 항목에 첨부 될 수 있으므로 CLR 속성으로 구현할 수 없습니다. 대신 한 쌍의 정적 메소드가 도입됩니다.
따라서 표준 종속성 속성과 달리 DependencyObject
에서 파생되지 않은 클래스에서는 연결된 속성을 정의 할 수 있습니다.
종속성 속성 인 RowProperty
에는 GetRow
및 SetRow
라는 해당 메서드가 있습니다.
주의 사항
MSDN에 문서화 된 대로 :
속성 값 상속은 연결되지 않은 종속성 속성에서 작동하는 것처럼 보일 수 있지만 런타임 트리의 특정 요소 경계를 통해 연결되지 않은 속성에 대한 상속 동작은 정의되지 않습니다. 항상 RegisterAttached를 사용하여 메타 데이터에서 상속을 지정하는 위치의 등록 정보를 등록하십시오.
읽기 전용 종속성 속성
언제 사용 하는가?
읽기 전용 종속성 속성은 일반 종속성 속성과 유사하지만 컨트롤 외부에서 해당 값을 설정할 수 없도록 구성되어 있습니다. IsMouseOver
또는 IsKeyboardFocusWithin
소비자에게 정보를 제공하는 속성이있는 경우에 효과적입니다.
정의 방법
표준 종속성 속성과 마찬가지로 읽기 전용 종속성 속성은 DependencyObject
에서 파생 된 클래스에 정의해야합니다.
public class MyControl : Control
{
private static readonly DependencyPropertyKey MyPropertyPropertyKey =
DependencyProperty.RegisterReadOnly("MyProperty", typeof(int), typeof(MyControl),
new FrameworkPropertyMetadata(0));
public static readonly DependencyProperty MyPropertyProperty = MyPropertyPropertyKey.DependencyProperty;
public int MyProperty
{
get { return (int)GetValue(MyPropertyProperty); }
private set { SetValue(MyPropertyPropertyKey, value); }
}
}
정규 종속성 속성에 적용되는 것과 동일한 규칙이 여기에도 적용되지만 두 가지 중요한 차이점이 있습니다.
-
DependencyProperty
는private
DependencyPropertyKey
에서 제공됩니다. - CLR 속성 설정자는
public
아닌protected
또는private
입니다.
Setter는 MyPropertyPropertyKey
전달하고 MyPropertyProperty
는 SetValue
메서드에 전달하지 않습니다. 속성이 읽기 전용으로 정의되었으므로 속성에서 SetValue
를 사용하려는 모든 시도는 DependencyPropertyKey
를받는 오버로드와 함께 사용해야합니다. 그렇지 않은 경우, InvalidOperationException
가 Throw됩니다.