2013-05-27 2 views
2

나는 반사를 통해 TabControl에 대한 datacontext로 바인딩 된 컨트롤리스트를 생성하고 리플렉션을 사용하여 만들어진 콘텐트가 콘텐트가 바인딩 된 곳인 ContentPresenter 콘트롤로 표현되는 윈도우를 가지고있다. 나는 몇 가지 물건들이 이벤트에 subcribing 또는 어떤 방법 또는 스레드를들이받은 같은 생성 된 컨트롤 (그들의 모든 하나 하나)에 수행해야 생성 후 누군가 WPF 이벤트의 이상한 동작을 설명 할 수 있습니까?

<TabControl.ContentTemplate> 
    <DataTemplate> 
     <ContentPresenter Content="{Binding sub}" Loaded="smb_Loaded"> 
     </ContentPresenter> 
    </DataTemplate> 
</TabControl.ContentTemplate> 

, 그래서 나는 그것이 이후에 수행되는 것으로 원 개체의 초기화 또는 생성. 이 물건을 "Initialized"또는 "Loaded"이벤트 이후에 처리하려고 시도했지만 둘 다 첫 번째 컨트롤 만로드 할 때만 트리거됩니다. 리플렉션을 사용하여 3 개의 컨트롤을 만드는 경우 컨트롤이 들어있는 내용이 ContentPresenters 인 탭이 3 개 있습니다. 하나의 탭을 선택하면 이벤트가 트리거됩니다. 그런 다음 다른 응용 프로그램을 선택하면 응용 프로그램을 다시 실행할 때까지 전혀 트리거되지 않습니다.

+0

당신이이 부분을 바꿔 주실 래요 ... 관련 코드를 게시해야합니다 rhe 만든 컨트롤 (모두) *? 이해하기 어렵습니다. – DHN

+1

탭 컨트롤은 특정 항목 컨트롤입니다. 항목 목록 (탭 항목)을 표시하지만 각 항목의 내용을 표시하는 내용 발표자는 하나뿐입니다. 탭 컨트롤에서'SelectionChanged '를들을 수 있습니다. – XAMeLi

+0

이러한 컨트롤을 만든 후에 위 코드와 같이 컨트롤을 콘텐츠 발표자의 콘텐츠로 설정합니다. 폼을 만들고 삽입 한 후에 동적으로 생성 된 컨트롤의 몇 가지 이벤트에 착수하고 초기화 작업을 수행해야합니다. 생성 된 후에 트리거 할 이벤트가 필요하지만 "Isinitialized"이벤트는 컨트롤의 첫 번째에서만 트리거됩니다. 다른 사람들에게는 절대. – user853710

답변

0

당신은 항목 컬렉션에서 변경을들을 수 있습니다 : 컨트롤이 SelectionChanged 이벤트에 등록 할 필요가로드 될 때

CollectionViewSource.GetDefaultView(tab.Items).CollectionChanged += (o, ev) => 
{ 
    Console.WriteLine("item added"); 
}; 
0

Initializationloaded 이벤트가 한 번만 실행됩니다.

<TabControl SelectionChanged="TabControl_SelectionChanged"> 
    <TabControl.ContentTemplate> 
    <DataTemplate> 
     <ContentPresenter Content="{Binding sub}" Loaded="smb_Loaded"> 
     </ContentPresenter> 
    </DataTemplate> 
    </TabControl.ContentTemplate> 
</TabControl> 

private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    // do all your logic here 
    // subscribe to events 
} 

뒤에 코드가 선택되지 않은 항목의와 previosly 등록 이벤트 등록을 취소하는 것을 잊지 마세요. * 물건이 짓을 할 : SelectionChanged 이벤트가 동적으로 컨트롤을 만들 때 요구 사항이 이벤트를 등록 만족하지

경우

+0

Selectionchanged는 나에게 전혀 쓸모가 없습니다. 초기화 된 이벤트 핸들러를 트리거 할 때 수행해야하는 이벤트를 등록하려면 하나의 tabitem에서만 트리거합니다. 다른 사람들에게는 없습니다. 이것은 이상한 행동입니다. selectchanged 이벤트는이 스토리에서 관련이 있습니다.로드 된 이벤트 핸들러 또는 초기화 된 이벤트 핸들러는 처음 선택한 이벤트에서 트리거됩니다. 붙여 넣은 코드에 따르면 모든 tabitem을로드 할 때 트리거해야하지만 그 중 하나에서만 트리거됩니다. – user853710

+0

@ user853710 contentPresenter가 트리거 된 이유는 탭 컨트롤 자체가로드되는 것이 이상하지 않습니다. 일단. 당신은 당신이 정말로 무엇을하고 실패하려고하는지 분명하지 않기 때문에 관련 등록 코드를 게시해야 할 것입니다. – makc

+0

이벤트 구독을 수동으로 설정할 수있는 객체 생성 후 메소드를 호출 할 수 있습니까? 사용자가 탭을 선택하기 전에 몇 가지 사항을 설정해야합니다. – user853710

관련 문제