2009-11-25 33 views
45

Trong WPF Binding.Mode, khi chọn Default, nó phụ thuộc vào thuộc tính bị ràng buộc.Mặc định cho Binding.Mode = Mặc định cho điều khiển WPF là gì?

Tôi đang tìm một số danh sách hoặc một số quy ước hoặc bất kỳ thông tin nào về mặc định cho các điều khiển khác nhau.
Ý tôi là, thuộc tính nào là TwoWay theo mặc định và v.v. Bất kỳ liên kết, ý tưởng, suy nghĩ và thậm chí rants được hoan nghênh!

Trả lời

48

Tương tự như UpdateSourceTrigger, giá trị mặc định cho thuộc tính Chế độ thay đổi cho từng thuộc tính. thuộc tính người dùng có thể chỉnh sửa như TextBox.Text, ComboBox.Text, MenuItem.IsChecked, vv, có TwoWay như giá trị Chế độ mặc định của họ. Để tìm số nếu mặc định là TwoWay, hãy xem Thông tin thuộc tính phụ thuộc phần của thuộc tính. Nếu nó cho biết BindsTwoWayByDefault được đặt thành true, thì giá trị Chế độ mặc định của thuộc tính là TwoWay. Để làm điều đó lập trình, có được siêu dữ liệu tài sản của tài sản bằng cách gọi GetMetadata và sau đó kiểm tra giá trị boolean của BindsTwoWayByDefault tài sản.

Nguồn: http://blogs.msdn.com/wpfsdk/archive/2006/10/19/wpf-basic-data-binding-faq.aspx

Cách an toàn nhất là luôn luôn rõ ràng những loại chế độ ràng buộc mà bạn muốn từ một ràng buộc.

+2

Có nơi nào tôi có thể tìm thấy danh sách tất cả các thuộc tính và giá trị mặc định BindingMode của chúng không? các quy tắc là gì? – Shimmy

+0

Danh sách các thuộc tính là vô tận. Tôi đoán http://msdn.microsoft.com liệt kê hầu hết những thứ từ Microsoft. Tôi không thấy bất kỳ thông tin và chế độ ràng buộc ở đó vì vậy tôi đoán bạn sẽ phải tìm ra điều đó một mình. Url mà tôi đưa ra trong câu trả lời của tôi giải thích cách tìm chúng –

+3

Điều gì về các thuộc tính phụ thuộc có siêu dữ liệu là UIPropertyMetadata chứ không phải là FrameworkPropertyMetadata? Các tài liệu MSDN cho các thuộc tính như vậy không đề cập đến BindsTwoWayByDefault vì boolean đó không tồn tại trên UIPropertyMetadata. – HappyNomad

8

Dưới đây là một cách để tìm ra chế độ mặc định hỗ trợ bởi một DP -

NET Reflector là bạn của bạn. Với phản xạ, tìm kiếm TextBox và xem mã nguồn của hàm tạo tĩnh (.cctor()). Ở đây, bạn sẽ có thể tìm thấy mã sử dụng để đăng ký 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 
        ) 
       ); 

Chú ý rằng một tham số được truyền cho phương thức ký chỉ mặc định Binding Mode: FrameworkPropertyMetadataOptions.BindsTwoWayByDefault. Nếu bạn sử dụng phản xạ để xem đăng ký Text DP của TextBlock, bạn sẽ thấy rằng không có giá trị như vậy được chuyển, trong trường hợp này, chúng tôi giả định ràng buộc là một cách theo mặc định.

Trích từ bài Bea Stollnitz của: How can I update an explicit binding within a template?

Mặc dù có một số loại danh sách quan trọng của DP sẽ rất hữu ích.

0

Cũng đang tìm kiếm một danh sách, chủ yếu để tìm ra các ràng buộc nào có thể được đặt thành một chiều để cải thiện hiệu suất.Các chức năng sau có thể giúp bạn tìm kiểm soát sử dụng hai chiều ràng buộc theo mặc định:

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; 
} 

Sử dụng chức năng in, cho chúng ta một danh sách:

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}"); 
    } 
} 

kết quả mẫu (các thuộc tính kiểm soát với hai chiều ràng buộc theo mặc định)

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 

Điều thú vị là hầu hết các điều khiển đều có thuộc tính TextSearch có liên kết hai chiều.

Các vấn đề liên quan