我有以下xaml:
<phone:PivotItem Header="MESSAGES" x:Name="Messages">
...
<ListBox x:Name="MessagesStreamList">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid x:Name="ParticipantImages">
</Grid>
如何以编程方式遍历以获取ParticipantImages
,以便我可以通过编程方式添加列等?
我无法直接访问ParticipantImages
--------- EDIT -----------
我刚尝试使用VisualTreeHelper:
int poop = VisualTreeHelper.GetChildrenCount(MessagesStreamList);
但这会返回 0 的计数。
这是否与ItemTemplate有关?
答案 0 :(得分:1)
因为它位于DataTemplate中,所以无法从ListBox(或包含列表框的窗口)中按名称获取它。
您可以做的是用用户控件替换数据模板内的Grid,将网格放入该用户控件,然后使用该用户控件内的代码进入Grid。
用户控件定义为:
<UserControl x:Class="WpfApplication1.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
Loaded="UserControl_Loaded_1">
<Grid x:Name="ParticipantImages">
</Grid>
</UserControl>
然后在代码中你可以做到:
/// <summary>
/// Interaction logic for UserControl1.xaml
/// </summary>
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
}
private void UserControl_Loaded_1(object sender, RoutedEventArgs e)
{
ParticipantImages.Visibility = System.Windows.Visibility.Hidden;
}
}
答案 1 :(得分:0)
我意识到这是一个延迟的反应,但今天我在寻找类似的东西时遇到了这个。
我的目标是修改DataTemplate列表框中的某些项的属性。 这是我的结构:
<ListBox ItemsSource="{Binding}" SelectionChanged="Items_SelectionChanged">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
在选择更改时,我想修改已更改项目的某些属性。我不认为这是最有效的方式,但它是我得到的。
private void List_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
DependencyObject obj = (DependencyObject)sender;
obj = loopUntilDesiredTypeIsFound<ListBoxItem>(obj);
for (int i=0; i<VisualTreeHelper.GetChildrenCount(obj); i++)
{
ListBoxItem item = (ListBoxItem)VisualTreeHelper.GetChild(obj,i);
if (item.IsSelected)
{
DependencyObject container = loopUntilDesiredTypeIsFound<Grid>(item);
//here we will have the Grid container for the display objects, such as textblocks, checkboxes, etc..
break;
}
}
}
private DependencyObject getChild(DependencyObject obj)
{
if (VisualTreeHelper.GetChildrenCount(obj) > 0 )
{
return VisualTreeHelper.GetChild(obj, 0);
}
return null;
}
private DependencyObject loopUntilDesiredTypeIsFound<T>(DependencyObject obj)
{
while (obj != null)
{
int children = VisualTreeHelper.GetChildrenCount(obj);
if (getChild(obj) is T)
{
return obj;
}
obj = getChild(obj);
}
return null;
}