2015-01-20 4 views
0

에서 목록 항목 제어를 돌아 오십시오 내가 사용자 컨트롤은 런타임에 해당 사용자가 입력 것이다 로컬 스토리지 값이 있는지 항목 템플릿 WPF

<ListView Grid.Row="2" Name="lvItems"> 
     <ListView.ItemTemplate> 
       <DataTemplate> 
        <my1:ucItem Name="li"/> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
</ListView> 

, 아래와 같이 사용자 컨트롤 내 목록보기를 바인딩합니다. 런타임에 사용자 정의 컨트롤이 표시하는 다른 값을 추가하기 때문에 양방향 바인딩을 원하지 않습니다. 몇 가지 get 메소드를 설정하여 사용자 정의 컨트롤에 저장된 값을 반환합니다. 해당 사용자 정의 컨트롤을 다시 가져 오려면 어떻게해야합니까? lvItems.Items는 사용자 정의 컨트롤이 아닌 바인딩 된 객체 목록입니다. 생성 된 사용자 제어 목록을 되돌릴 수있는 방법이 있습니까?

예를 들면, 나는 그런 ListView에 항목을 다시 읽고 싶은,

foreach(UserControl uc in lvItems.Items){//Do Something} 
+0

UserControl'ucItem'에'lvItems' ItemSource를 원합니까? –

+0

아니요, lvItems Item Source에서 UserControl을 다시 가져옵니다. 예 : foreach (Usercontrol uC in lvItems.Items) {} 하지만 그렇게 작동하지 않습니다. – Sinon

+0

왜 그렇게 했습니까? 왜 내가 메인 페이지이 UserControl을에 바인딩 버튼 열 추가 –

답변

0

@Amit 바로 코멘트에, 당신이 정말로 MVVM 및 데이터 바인딩 접근 방식을 사용해야합니다.

public static class ItemsControlExtensions 
{ 
    public static IEnumerable<TElement> GetElementsOfType<TElement>(
     this ItemsControl itemsControl, string named) 
     where TElement : FrameworkElement 
    { 
     ItemContainerGenerator generator = itemsControl.ItemContainerGenerator; 

     return 
      from object item in itemsControl.Items 
      let container = generator.ContainerFromItem(item) 
      let element = GetDescendantByName(container as FrameworkElement, named) 
      where element != null 
      select (TElement) element; 
    } 

    static FrameworkElement GetDescendantByName(FrameworkElement element, 
     string elementName) 
    { 
     if (element == null) 
     { 
      return null; 
     } 

     if (element.Name == elementName) 
     { 
      return element; 
     } 

     element.ApplyTemplate(); 

     FrameworkElement match = null; 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++) 
     { 
      var child = VisualTreeHelper.GetChild(element, i) as FrameworkElement; 
      match = GetDescendantByName(child, elementName); 

      if (match != null) 
      { 
       break; 
      } 
     } 

     return match; 
    } 
} 

사용법은 다음과 같이 될 것이다 : 그것은 당신이 그것을 다른 방법을 결정하는 경우,이 확장 방법이 도움이 될 것입니다 말했다

GetDescendantByName 방법은 박사 WPF에 의해 하나를 기반으로
foreach (UserControl uc in lvItems.GetElementsOfType<UserControl>(named: "li")) 
{ 
    // do something with 'uc' 
} 

이 블로그 게시물에서 : ItemsControl: 'G' is for Generator. 사실 ItemsControl의 작동 방식에 대한 전체 블로그 게시물 시리즈는 읽을 가치가 있습니다. Dr WPF: ItemsControl: A to Z.