WPF 컨트롤에 대한 Binding.Mode = Default의 기본값은 무엇입니까?
WPF Binding.Mode
에서 Default를 선택하면 바인딩되는 속성에 따라 다릅니다.
다양한 컨트롤의 기본값에 대한 목록이나 규칙 또는 정보를 찾고 있습니다.
내 말은, TwoWay
기본적으로 어떤 속성이 있는지 등등. 모든 링크, 아이디어, 생각 및 심지어 폭언도 환영합니다!
UpdateSourceTrigger와 마찬가지로 Mode 속성의 기본값은 속성마다 다릅니다. 같은 사용자 편집 가능한 속성은
TextBox.Text
,ComboBox.Text
,MenuItem.IsChecked
, 등이TwoWay
기본 모드 값으로. 기본값이인지 확인하려면TwoWay
속성의 종속성 속성 정보 섹션을 확인하세요. 이 말합니다 경우BindsTwoWayByDefault
true로 설정 한 다음 속성의 디폴트 모드 값입니다TwoWay
. 프로그래밍 방식으로 수행하려면 호출하여 속성의 속성 메타 데이터를GetMetadata
가져온 다음 속성 의 부울 값을 확인합니다BindsTwoWayByDefault
.
가장 안전한 방법은 바인딩에서 원하는 바인딩 모드의 종류를 항상 명시하는 것입니다.
DP에서 지원하는 기본 모드를 찾는 방법은 다음과 같습니다.
.NET Reflector는 당신의 친구입니다. 리플렉터
TextBox
를 사용하여 정적 생성자 (.cctor()
) 의 소스를 검색 하고 살펴 봅니다 . 여기에서TextProperty
DP 등록에 사용 된 코드를 찾을 수 있습니다 .TextProperty = DependencyProperty.Register ( "Text", typeof(string), typeof(TextBox), new FrameworkPropertyMetadata ( string.Empty, FrameworkPropertyMetadataOptions.Journal | FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, new PropertyChangedCallback(TextBox.OnTextPropertyChanged), new CoerceValueCallback(TextBox.CoerceText), true, UpdateSourceTrigger.LostFocus ) );
기본 바인딩 모드를 나타내는 매개 변수가 Register 메서드에 전달됩니다
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault
.. 리플렉터를 사용하여 TextBlock의 Text DP에 대한 등록을 살펴보면 이러한 값이 전달되지 않음을 알 수 있으며이 경우 바인딩은 기본적으로 단방향이라고 가정합니다.
Bea Stollnitz의 게시물에서 발췌 : 템플릿 내에서 명시 적 바인딩을 어떻게 업데이트 할 수 있습니까?
중요한 DP 목록이 있으면 매우 도움이 될 것입니다.
대부분 성능 향상을 위해 단방향으로 설정할 수있는 바인딩을 찾기 위해 목록도 찾고있었습니다. 다음 함수는 기본적으로 양방향 바인딩을 사용하는 컨트롤을 찾는 데 도움이 될 수 있습니다.
public IList<DependencyProperty> GetAttachedProperties(DependencyObject obj)
{
var result = new List<DependencyProperty>();
foreach (PropertyDescriptor pd in TypeDescriptor.GetProperties(obj, new Attribute[] { new PropertyFilterAttribute(PropertyFilterOptions.Valid) }))
{
var dpd = DependencyPropertyDescriptor.FromProperty(pd);
if (dpd != null)
{
result.Add(dpd.DependencyProperty);
}
}
return result;
}
public bool IsBindsTwoWayByDefault(DependencyObject obj, DependencyProperty property)
{
var metadata = property.GetMetadata(obj) as FrameworkPropertyMetadata;
if (metadata != null)
{
return metadata.BindsTwoWayByDefault;
}
return false;
}
인쇄 기능을 사용하여 목록을 제공합니다.
var objList = new List<DependencyObject> { new TextBox(), new TextBlock(), new Label(), new ComboBox(), new Button() };
foreach (var obj in objList)
{
var props = GetAttachedProperties(obj);
foreach (var prop in props)
{
if(IsBindsTwoWayByDefault(obj, prop))
Debug.WriteLine($"{obj} : {prop.OwnerType}:{prop.Name}");
}
}
샘플 결과 (기본적으로 양방향 바인딩을 사용하는 컨트롤 속성)
System.Windows.Controls.TextBox : System.Windows.Controls.TextBox:Text
System.Windows.Controls.TextBox : System.Windows.Controls.TextSearch:Text
System.Windows.Controls.TextBlock : System.Windows.Controls.TextSearch:Text
System.Windows.Controls.Label : System.Windows.Controls.TextSearch:Text
System.Windows.Controls.ComboBox Items.Count:0 : System.Windows.Controls.ComboBox:IsDropDownOpen
System.Windows.Controls.ComboBox Items.Count:0 : System.Windows.Controls.ComboBox:Text
System.Windows.Controls.ComboBox Items.Count:0 : System.Windows.Controls.Primitives.Selector:SelectedIndex
System.Windows.Controls.ComboBox Items.Count:0 : System.Windows.Controls.Primitives.Selector:SelectedItem
System.Windows.Controls.ComboBox Items.Count:0 : System.Windows.Controls.Primitives.Selector:SelectedValue
System.Windows.Controls.ComboBox Items.Count:0 : System.Windows.Controls.TextSearch:Text
System.Windows.Controls.Button : System.Windows.Controls.TextSearch:Text
흥미롭게도 대부분의 컨트롤에는 양방향 바인딩이있는 TextSearch 속성이 있습니다.
'Development Tip' 카테고리의 다른 글
undefined 값을 설정하면 어떻게됩니까? (0) | 2020.12.12 |
---|---|
동적 할당없이 런타임에 배열 크기가 허용됩니까? (0) | 2020.12.12 |
sh의 소스 대체 (0) | 2020.12.12 |
C # 6 보간 된 문자열을 사용하여 double 형식을 지정하는 방법은 무엇입니까? (0) | 2020.12.11 |
쿼리 문자열 앞에 슬래시를 건너 뛰어도됩니까? (0) | 2020.12.11 |