Development Tip

WPF 컨트롤에 대한 Binding.Mode = Default의 기본값은 무엇입니까?

yourdevel 2020. 12. 12. 12:31
반응형

WPF 컨트롤에 대한 Binding.Mode = Default의 기본값은 무엇입니까?


WPF Binding.Mode에서 Default를 선택하면 바인딩되는 속성에 따라 다릅니다.

다양한 컨트롤의 기본값에 대한 목록이나 규칙 또는 정보를 찾고 있습니다.
내 말은, TwoWay기본적으로 어떤 속성이 있는지 등등. 모든 링크, 아이디어, 생각 및 심지어 폭언도 환영합니다!


UpdateSourceTrigger와 마찬가지로 Mode 속성의 기본값은 속성마다 다릅니다. 같은 사용자 편집 가능한 속성은 TextBox.Text, ComboBox.Text, MenuItem.IsChecked, 등이 TwoWay기본 모드 값으로. 기본값이인지 확인하려면 TwoWay속성의 종속성 속성 정보 섹션을 확인하세요. 이 말합니다 경우 BindsTwoWayByDefaulttrue로 설정 한 다음 속성의 디폴트 모드 값입니다 TwoWay. 프로그래밍 방식으로 수행하려면 호출하여 속성의 속성 메타 데이터를 GetMetadata가져온 다음 속성 의 부울 값을 확인합니다 BindsTwoWayByDefault.

출처 : https://web.archive.org/web/20100209025938/http://blogs.msdn.com/wpfsdk/archive/2006/10/19/wpf-basic-data-binding-faq.aspx

가장 안전한 방법은 바인딩에서 원하는 바인딩 모드의 종류를 항상 명시하는 것입니다.


DP에서 지원하는 기본 모드를 찾는 방법은 다음과 같습니다.

.NET Reflector는 당신의 친구입니다. 리플렉터 TextBox를 사용하여 정적 생성자 ( .cctor()) 의 소스를 검색 하고 살펴 봅니다 . 여기에서 TextPropertyDP 등록에 사용 된 코드를 찾을 수 있습니다 .

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 속성이 있습니다.

참고 URL : https://stackoverflow.com/questions/1797105/what-are-the-defaults-for-binding-mode-default-for-wpf-controls

반응형