2014-05-14 1 views
1

저는 C# Store App을 사용하고 DataTemplate 선택기를 사용하여 Array에 바인딩 된 ListView 컨트롤에서 사용할 템플릿 유형을 결정합니다. 그것은 템플릿이므로 각 ListView Row에 동적 x : Name을 할당 할 수 없습니다.XAML DataTemplate Listview에서 요소에 액세스하는 방법

인덱스별로 목록 뷰 행에 액세스하고 해당 행의 표시 여부를 설정 또는 해제 할 수 있어야합니다. 나는이 같은 일을 시도하지만, .ItemContainerGenerator .ContainerFromItem(item); 반환 null와 나는 NULL이 예외 때마다 얻을 :

How do I access a control inside a XAML DataTemplate?

몇 가지 조사를 수행 한 후, 내가 만지거나 selectedItem가 설정되어있는 경우 위의 솔루션은 작동 나타납니다 . 나는 방법, 페이지로드에 모두 (초기 설정) 또한 버튼 클릭에 전화하여 특정 행 가시성을 수정할 수 있어야

Why does ItemContainerGenerator return null?

여기를 참조하십시오.

답변

2

이 당신이 원하는 일을해야합니다

var items = grid.ItemsSource as IEnumerable<MyModel>; 
foreach (var item in items) 
{ 
    var container = grid.ContainerFromItem(item); 
    var button = Children(container) 
     .Where(x => x is Button) 
     .Select(x => x as Button) 
     .Where(x => x.Name.Equals("MyButton")) 
     .FirstOrDefault(); 
    if (button == null) 
     continue; 
    if (item.ShouldBeVisible) 
     button.Visibility = Visibility.Visible; 
    else 
     button.Visibility = Visibility.Collapsed; 
} 

이 사용 :

public List<Control> Children(DependencyObject parent) 
{ 
    var list = new List<Control>(); 
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) 
    { 
     var child = VisualTreeHelper.GetChild(parent, i); 
     if (child is Control) 
      list.Add(child as Control); 
     list.AddRange(Children(child)); 
    } 
    return list; 
} 

행운을 빕니다!

관련 문제