我正在開發一個Windows Phone 8應用程序,其中,我正在使用列表框來顯示多個詳細信息。我的問題是,我想訪問代碼後面的數據模板,即我想訪問完整的數據模板,訪問所有在數據模板中聲明的子模板。訪問列表框的完整數據模式
只是我想改變列表框內的數據模板內的元素的可見性。請提出建議。
在此先感謝
我正在開發一個Windows Phone 8應用程序,其中,我正在使用列表框來顯示多個詳細信息。我的問題是,我想訪問代碼後面的數據模板,即我想訪問完整的數據模板,訪問所有在數據模板中聲明的子模板。訪問列表框的完整數據模式
只是我想改變列表框內的數據模板內的元素的可見性。請提出建議。
在此先感謝
這聽起來像你想有一個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}}"/>
本質上說「顯示電子郵件,但如果電子郵件爲空,則隱藏此字段」。
我發現了這個問題
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.
爲什麼要更新DataTemplate這種方式?它不會更改您已經可以看到的當前創建的列表項目。它期望你實際上想單獨綁定/更新每個列表項。 –