2014-11-09 5 views
0

템플릿 컨트롤이 있습니다. 템플릿의 일부는 다음과 같습니다.Windows Phone, ItemsControl.ContainerFromIndex가 null을 반환합니다.

<ItemsControl x:Name="icSubObjects"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Orientation="Horizontal" /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <local:StateButton Content="{Binding}" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

Items이 패널의 소스는 코드 숨김으로 설정됩니다. 객체가 제대로 표시되고 icSubObjects.Items.Count가 0보다 큰 것을, 나는 항상 사실에도 불구하고, 널 얻을 icSubObjects.ContainerFromIndex(i)을 caling 후

for (int i = 0; i < icSubObjects.Items.Count; i++) 
{ 
    var element = icSubObjects.ContainerFromIndex(i); 
    if (element is StateButton) 
    { 
     var btn = element as StateButton; 

     // btn is always null, despite icSubObjects.Items.Count being > 0 
    }      
} 

:

그런 다음 코드에서 나는 데이터로부터 생성 된 실제 개체에 액세스하려고 해요 이 방법을 올바르게 작동 시키려면 어떻게해야합니까? (또는 누구인지 내가 잘못하고?)


편집 : 나는 문제가 해결 인터넷 트릭에 발견

줄거리가 전개된다. 테이너이어서 올바르게 배치

var temp = gContainer.Children; 

다음 트릭 ItemsControl 제어를 보유 용기들 중 하나의 Children 속성을 "접촉"하는 것이다.

다른 문제가 있습니다. ContainerFromIndex에서 ContentPresenter를 얻습니다. ContentPresenterDataTemplate 안에있는 StateButton에 어떻게 액세스 할 수 있습니까?

+0

@ 클레멘스 당신은 실제로 아직 질문하지 않은 다음 질문에 대답하려고했습니다. 인터넷상의 어딘가에서 발견 된 것과 같이 문제가 해결되었습니다. 컨테이너의 'Children'속성에 "ItemsControl '이 배치됩니다. 이제이 'ContentPresenter'를 얻었지만'Content' 속성을'StateButton'으로 형변환하면 null이 반환됩니다. 'ContentPresenter'의'Content'는 단순한 문자열입니다. 어떤 아이디어? – Spook

+0

죄송합니다, 잘못된 추적을하고있었습니다. StateButton은 Content 프로퍼티에 삽입되지 않습니다. WPF에서는 XAML에서 이름을 지정하여 (예 :'x : Name = "sb"'를 설정하고 element.ContentTemplate.FindName ("sb", 요소)'(요소는 ContentPresenter)를 호출하여 가져옵니다. 이것이 Windows Phone에서 작동하는지 확실하지 않습니다. – Clemens

답변

0

질문에서 아래의 설명을 읽는 것으로부터, btn이 항상 null 인 이유를 이미 알고 있다는 것을 이해합니다. (심지어 if 문을 입력하지 않았을지라도). 어쨌든, 나는 알고 싶은 사람을 위해 다시 말하겠습니다.

ContainerFromIndex은 ContentPresenter (대부분의 경우)을 반환합니다. StateButton 아니요입니다.

이제

, 당신은 ContentPresenter에에서 원하는 StateButton를 얻기 위해, 난 당신이 할 수 있다고 생각 :

var btn = (StateButton)VisualTreeHelper.GetChild(contentPresenter, 0); 

은 그 즉 (작동하지 않는 경우, StateButton 먼저 만하지 않습니다 ContentPresenter의 자식), 시각적 트리를 확인하고 코드를 수정하여 트리에서 필요한 요소를 가져옵니다.