【发布时间】:2011-07-08 01:17:09
【问题描述】:
我有一个 ListBox,包括一个带有 2 个 StackPanel 的 ItemTemplate。 我要访问的第二个 StackPanel 中有一个 TextBox。 (将其可见性更改为 true 并接受用户输入) 触发器应该是 SelectionChangedEvent。因此,如果用户单击 ListBoxItem,TextBlock 将变得不可见,而 TextBox 变得可见。
XAML 代码:
<ListBox Grid.Row="1" Name="ContactListBox" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" ItemsSource="{Binding Contacts}" Margin="0,36,0,0" SelectionChanged="ContactListBox_SelectionChanged">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Margin="0,0,0,0">
<toolkit:ContextMenuService.ContextMenu>
<toolkit:ContextMenu>
<toolkit:MenuItem Header="Edit Contact" Click="ContactMenuItem_Click"/>
<toolkit:MenuItem Header="Delete Contact" Click="ContactMenuItem_Click"/>
</toolkit:ContextMenu>
</toolkit:ContextMenuService.ContextMenu>
<Grid>
<Rectangle Fill="{StaticResource PhoneAccentBrush}"
Width="72" Height="72">
<Rectangle.OpacityMask>
<ImageBrush ImageSource="/Images/defaultContactImage.png" Stretch="UniformToFill"/>
</Rectangle.OpacityMask>
</Rectangle>
</Grid>
<StackPanel>
<TextBox Text="{Binding Name}" TextWrapping="Wrap" Visibility="Collapsed"/>
<TextBlock Text="{Binding Name}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}" />
<TextBlock Text="{Binding Number}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextAccentStyle}"/>
</StackPanel>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我想有几种方法可以解决这个问题,但我没有尝试过。
我目前的做法是这样的
private void ContactListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ListBoxItem listBoxItem = ContactListBox.SelectedItem as ListBoxItem;
DataTemplate listBoxTemplate = listBoxItem.ContentTemplate;
// How to access the DataTemplate content?
StackPanel outerStackPanel = listBoxTemplate.XXX as StackPanel;
StackPanel innerStackPanel = outerStackPanel.Children[1] as StackPanel;
TextBox nameBox = innerStackPanel.Children[0] as TextBox;
TextBlock nameBlock = innerStackPanel.Children[1] as TextBlock;
nameBox.Visibility = System.Windows.Visibility.Visible;
nameBlock.Visibility = System.Windows.Visibility.Collapsed;
}
【问题讨论】:
-
我喜欢这个解决方案,但是如果我的文本块很少并且我想让可见/折叠不是第一个而是前。 2号还是3号?换句话说如何进入具有指定名称的列表框控件?
-
@sust86 listBoxTemplate.XXX 中的 XXX 是什么?
-
如果您想按名称进行迭代,请使用此解决方案:stackoverflow.com/a/1759923/3934111
-
这是一篇 MSDN 文章,可能也有助于向仍然想知道的任何人解释这些东西:msdn.microsoft.com/en-us/library/bb613579(v=vs.110).aspx
标签: c# xaml windows-phone-7 silverlight-4.0