2013-06-18 52 views
0

我正在開發一個Windows Phone 8應用程序,其中,我正在使用列表框來顯示多個詳細信息。我的問題是,我想訪問代碼後面的數據模板,即我想訪問完整的數據模板,訪問所有在數據模板中聲明的子模板。訪問列表框的完整數據模式

只是我想改變列表框內的數據模板內的元素的可見性。請提出建議。

在此先感謝

+0

爲什麼要更新DataTemplate這種方式?它不會更改您已經可以看到的當前創建的列表項目。它期望你實際上想單獨綁定/更新每個列表項。 –

回答

0

這聽起來像你想有一個DataTemplate顯示或隱藏基於它綁定到對象的屬性某些元素。其中一個更好的方法來得到這個是做線沿線的東西:

class MyData 
{ 
    ... 
    public string Email {get {...} set {...}} 
    ... 
} 

既然可以在用戶或可能不會有一個電子郵件地址,你的DataTemplate可以使用轉換器的電子郵件的字符串值轉換成Visibility可用於顯示或隱藏該字段的值。該轉換器看起來是這樣的:

public class StringNotNullToVisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     string text = value as string; 

     if (!string.IsNullOrEmpty(text)) 
     { 
      return Visibility.Visible; 
     } 

     return Visibility.Collapsed; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

和你在XAML中的引用添加到它像:

<phone:PhoneApplicationPage.Resources> 
    <this:StringNotNullToVisibilityConverter x:Key="StringNotNullToVisibilityConverter"/> 
</phone:PhoneApplicationPage.Resources> 

最後你DataTemplate將有一個看起來像一條線:

<TextBlock Text="{Binding Email}" Visibility="{Binding Email, Converter={StaticResource StringNotNullToVisibilityConverter}}"/> 

本質上說「顯示電子郵件,但如果電子郵件爲空,則隱藏此字段」。

1

我發現了這個問題

public static T FindFirstElementInVisualTree<T>(DependencyObject parentElement) where T : DependencyObject 
    { 
     try 
     { 
      var count = VisualTreeHelper.GetChildrenCount(parentElement); 
      if (count == 0) 
       return null; 

      for (int i = 0; i < count; i++) 
      { 
       var child = VisualTreeHelper.GetChild(parentElement, i); 
       if (child != null && child is T) 
       { 
        return (T)child; 
       } 
       else 
       { 
        var result = FindFirstElementInVisualTree<T>(child); 
        if (result != null) 
         return result; 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
     return null; 
    } 

一個解決方案,我用這個方法來找出我的數據模板中的第一元素,然後我改變了元素的可見性。 這裏是一個示例如何使用這種方法..

ListBoxItem item = this.lstboxMedicationList.ItemContainerGenerator.ContainerFromIndex(i) as ListBoxItem; 
CheckBox tagregCheckBox = FindFirstElementInVisualTree<CheckBox>(item); 
tagregCheckBox.Visibility = Visibility.Visible; 
lstboxMedicationList.UpdateLayout(); 

    here i is the index of ListBox item.