2013-10-23 8 views
0

TextBox와 ComboBox와 같은 입력 컨트롤이 포함 된 WPF의 ContentControl이 있습니다. 각 컨트롤은 ViewModel의 주어진 속성에 데이터 바인딩되어 있으며 UpdateSourceTrigger=Explicit입니다. VisualTreeHelper.GetChild()를 반복하고 데이터 바인딩이 포함 된 컨트롤에서 UpdateSource를 호출합니다.

내가 약간의 "제출"버튼을 클릭하면, 나는 바인딩을 가지고 FormularioPaciente의 모든 자식을 통과하고, UpdateSource를 호출 할 :

private void btnSalvarEditarPaciente_Click(object sender, System.Windows.RoutedEventArgs e) { 
     foreach (var childControl in LogicalTreeHelper.GetChildren(FormularioPaciente)) { 
      // what should I do now? 
      // I would really like to "auto-find" everything that should be updated... 
     }      
    } 
+0

http://stackoverflow.com/questions/3586870/retrieve-all-data-bindings-from-wpf-window/3587263#3587263이 대답은 모든 바인딩을 찾을 수 있도록 도와줍니다. – Nitin

+0

@nit 정확하다고 생각했습니다. 중복되지만 BindingBase와 같이 바인딩을 찾는 법을 알려주기 때문에 IT는 아니지만 BindingExpression.UpdateSource를 호출하는 방법을 알려주지는 않습니다 ... – heltonbiker

+0

hmm..i이 답변을 업데이트했습니다. . 도와주세요. – Nitin

답변

2

을 난 당신이 솔루션을 약간 업데이트 할 수 있습니다 생각

void GetBindingsRecursive(DependencyObject dObj, List<BindingExpressions> bindingList) 
     { 
      bindingList.AddRange(DependencyObjectHelper.GetBindingObjects(dObj)); 

      int childrenCount = VisualTreeHelper.GetChildrenCount(dObj); 
      if (childrenCount > 0) 
      { 
       for (int i = 0; i < childrenCount; i++) 
       { 
        DependencyObject child = VisualTreeHelper.GetChild(dObj, i); 
        GetBindingsRecursive(child, bindingList); 
       } 
      } 
     } 

public static class DependencyObjectHelper 
     { 
      public static List<BindingExpression> GetBindingObjects(Object element) 
      { 
       List<BindingExpression> bindings = new List<BindingBase>(); 
       List<DependencyProperty> dpList = new List<DependencyProperty>(); 
       dpList.AddRange(GetDependencyProperties(element)); 
       dpList.AddRange(GetAttachedProperties(element)); 

       foreach (DependencyProperty dp in dpList) 
       { 
        BindingExpression b = BindingOperations.GetBindingExpression(element as DependencyObject, dp); 
        if (b != null) 
        { 
         bindings.Add(b); 
        } 
       } 

       return bindings; 
      } 

      public static List<DependencyProperty> GetDependencyProperties(Object element) 
      { 
       List<DependencyProperty> properties = new List<DependencyProperty>(); 
       MarkupObject markupObject = MarkupWriter.GetMarkupObjectFor(element); 
       if (markupObject != null) 
       { 
        foreach (MarkupProperty mp in markupObject.Properties) 
        { 
         if (mp.DependencyProperty != null) 
         { 
          properties.Add(mp.DependencyProperty); 
         } 
        } 
       } 

       return properties; 
      } 

      public static List<DependencyProperty> GetAttachedProperties(Object element) 
      { 
       List<DependencyProperty> attachedProperties = new List<DependencyProperty>(); 
       MarkupObject markupObject = MarkupWriter.GetMarkupObjectFor(element); 
       if (markupObject != null) 
       { 
        foreach (MarkupProperty mp in markupObject.Properties) 
        { 
         if (mp.IsAttached) 
         { 
          attachedProperties.Add(mp.DependencyProperty); 
         } 
        } 
       } 

       return attachedProperties; 
      } 
     } 

그리고 BindingExpression 목록을 얻은 후에는 BindingExpression.UpdateSource()으로 전화 할 수 있습니다.

+0

버디 +1 멋진 게시물! –

+0

@devhedgehog 감사합니다 내 친구 :)하지만 난 그냥 기존의 대답을 tweeked – Nitin