2011-10-07 2 views
1

일부 데이터 바인딩을 동적으로 수정해야합니다. 그래서 부모에서 컨트롤을 초기화하는 동안/후에 조작을 수행 할 계획이었습니다.OnLoad 메서드가없는 System.Windows.Controls.Control

오류 810 'Views.Test.OnLoad (경우 System.EventArgs를)':

내 코드를 무시하는 것으로 더 적합한 방법을

그러나 the msdn page on Control.OnLoad Method에도 불구하고

내 클래스는 컴파일하지 거부 :

class Test : Control 
{ 
    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 
     if (true) 
     { 
      System.Diagnostics.Debug.Assert(false);    
     } 
    } 
} 

내가 뭘 잘못하고 있는지 알기 원하십니까?

편집 : 내 수업이

이 System.Windows.Controls.Control

에서 유래 그래서 제 질문이되기 때문에 @Roken 내가 System.Web.UI.Control과 일치하지있는 것을 발견했습니다 어떻게해야 이 컨트롤의 바인딩에 대한 수정을 수행합니까? 재정의 할 방법이나 가입 할 이벤트는 무엇입니까?

+0

달성하려는 목표를 설명 할 수 있습니까? 그래서 우리는 당신을 다른 방법으로 조언 할 수 있습니다. btw 당신은'Loaded' 이벤트를 처리 할 수 ​​있습니다. –

+0

콤보 상자에 표시된 열거 형에 대한 자체 변환기를 서브 클래스하고 있습니다. 내 변환기 개체를 일부 외부 처리 (건설 매개 변수 같은) 및 정방향 변환기가 아니라 순수한 XAML 단순히 전달할 수없는 straigth 앞으로 변환기, 더 많은 그래서 XAML 파일을 같이 작업해야합니다 이미 2000 줄 (및이 악이다). 그래서 내 컨트롤 뒤에 코드에서 바인딩 변환기 처리 할 줄. 질문은 어떻게하면 컨트롤에 바인딩을 설정할 수 있는지에 대한 것입니다. –

답변

3

Windows Forms 컨트롤입니까, 웹 컨트롤입니까? 당신이 제공 한 링크는 웹 컨트롤을위한 것입니다; WinForms 컨트롤에는 OnLoad()가 포함되어 있지 않습니다. OnCreateControl()은 WinForms에서는 사용할 수 있고 WPF에서는 OnInitialized() 일 수 있습니다.

+0

WPF 컨트롤 ... 다음에 어떤 다른 메서드를 재정의하거나 이벤트를 구독해야합니까? –

+0

WPF에 대해 OnInitialized()를 살펴보십시오. – roken

+0

그게 전부입니다. http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.oninitialized.aspx –

1

당신은 System.Web.UI.Control에서 파생 되었습니까? System.Windows.Forms.Control에서 파생 되었습니까?

System.Windows.Forms.Control은 가상의 OnLoad 메서드를 제공하지 않습니다.

+0

실제로 그것은 System.Windows.Controls.Control에서 파생되었습니다 ...하지만 내 경우에는 OnLoad와 같은 진입 점이 없으면 초기화 된 후 컨트롤에서 상호 작용하는 방법을 알지 못합니다 보수 –

1

System.Windows.Controls.Control하지 제공자 OnLoad 방법은, 당신이 약간의 노력과 최대한의 투명성과 컨버터를 설정합니다 ViewBinder를 작성하는 것이 좋습니다

1

MSDN는 귀하의 의견을 바탕으로 참조한다.

Rob Eisenberg의 말 : MIX10과 Caliburn 또는 해당 페이지에서 다운로드 할 수있는 말의 코드를 확인하십시오.

규칙에 따라 프레임 워크는 UI 요소를 찾아서 같은 이름의 속성과 일치시킵니다. 그리고 자동으로 바인딩을 생성하고 비틀기 :

private static void BindProperties(FrameworkElement view, IEnumerable<PropertyInfo> properties) 
{ 
    foreach (var property in properties) 
    { 
    var foundControl = view.FindName(property.Name) as DependencyObject; 
    if(foundControl == null) // find the element 
     continue; 

    DependencyProperty boundProperty; 
    if(!_boundProperties.TryGetValue(foundControl.GetType(), out boundProperty)) 
     continue; 
    if(((FrameworkElement)foundControl).GetBindingExpression(boundProperty) != null) // already bound 
     continue; 

    var binding = new Binding(property.Name) // create the binding 
    { 
     Mode = property.CanWrite ? BindingMode.TwoWay : BindingMode.OneWay, 
     ValidatesOnDataErrors = Attribute.GetCustomAttributes(property, typeof(ValidationAttribute), true).Any() 
    }; 

    if (boundProperty == UIElement.VisibilityProperty && typeof(bool).IsAssignableFrom(property.PropertyType)) 
     binding.Converter = _booleanToVisibilityConverter; 

    BindingOperations.SetBinding(foundControl, boundProperty, binding); 
    } 
} 

viewModel 유형에 정의 된 모든 속성을 소요하고 결합 public static void Bind(object viewModel, DependencyObject view) 방법에 명시 적으로 이루어집니다 바인딩.

관련 문제