如何使用 DataTemplate 访问列表框中的特定项目?

2023-11-27

我有一个 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;

    }

谢谢你们的帮助!最后我得到了它。解决了 VisualTreeHelper 的问题。多么棒的功能啊^^

private void ContactListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (ContactListBox.SelectedIndex == -1)
            return;

        currentSelectedListBoxItem = this.ContactListBox.ItemContainerGenerator.ContainerFromIndex(ContactListBox.SelectedIndex) as ListBoxItem;

        if (currentSelectedListBoxItem == null)
            return;

        // Iterate whole listbox tree and search for this items
        TextBox nameBox = helperClass.FindDescendant<TextBox>(currentSelectedListBoxItem);
        TextBlock nameBlock = helperClass.FindDescendant<TextBlock>(currentSelectedListBoxItem);

辅助函数

public T FindDescendant<T>(DependencyObject obj) where T : DependencyObject
    {
        // Check if this object is the specified type
        if (obj is T)
            return obj as T;

        // Check for children
        int childrenCount = VisualTreeHelper.GetChildrenCount(obj);
        if (childrenCount < 1)
            return null;

        // First check all the children
        for (int i = 0; i < childrenCount; i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(obj, i);
            if (child is T)
                return child as T;
        }

        // Then check the childrens children
        for (int i = 0; i < childrenCount; i++)
        {
            DependencyObject child = FindDescendant<T>(VisualTreeHelper.GetChild(obj, i));
            if (child != null && child is T)
                return child as T;
        }

        return null;
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 DataTemplate 访问列表框中的特定项目? 的相关文章

  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • WinRT 中的数据触发器?

    我能够找到事件触发 http msdn microsoft com en us library windows apps windows ui xaml eventtrigger 28v VS 85 29 aspx然而 在 WinRT 参考
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户

随机推荐

  • 如何直接在 iPhone 中将 OTP 从用户的消息框填充到应用程序? [复制]

    这个问题在这里已经有答案了 我正在开发一个互联网交易应用程序 其移动和 iPhone 应用程序可用 根据最近的市场趋势 我们正在努力纳入双因素身份验证 为此 我们将通过短信向用户注册的手机号码发送一次性密码 有没有一种方法可以将 OTP 从
  • iPhone 应用程序更新与新版本

    假设我在 Appstore 上有一个现有的 IOS 应用程序 版本为 1 0 现在我对应用程序做了一些更改并想提交回来 有两种不同的提交方式吗 就像我仍然可以将版本保留为 1 0 并仅提交应用程序或 我需要创建一个新版本 1 1 然后提交吗
  • 如何从给定日期查找一周的开始日期?

    我担心的是 我想从给定的日期检索一周的开始日期 例如 15 04 2015 所以一周的开始将是 13 04 2015 对我来说 一周的开始是周一 thanks 尝试这个 Dim FirstDayInWeek LastDayInWeek As
  • 躲避误差条和点以避免重叠

    我正在尝试修复错误栏 以便它们在我的图表上实际上是可读的 唯一造成问题的是 2013 年的数据 我该怎么做呢 我看到了一些关于抖动或闪避的帖子 但我不确定如何应用它来解决我的问题 这是我试图更改的代码 YearlyDensity lt re
  • 相当于Python中F#的Seq.scan()方法吗?

    有没有类似F 的函数Seq scan 在Python中 我想做一些cumsum or cumproduct 没有循环的事情 我认为 Ignacio 的解决方案几乎是正确的 但需要类型为 a gt a gt a 的运算符 并且不会产生第一个元
  • 如何在两个值之间随机选择?

    所以基本上我试图让一段代码在两个值 40 和 40 之间随机选择 为此 我正在考虑使用古老的数学 例如 random num 1 value 40 其中 value 1 2 random num 顾名思义应该是一个随机数 有什么帮助吗 我正
  • 在给定禁用的未经身份验证的 IdentityId 的情况下,我可以使用 AWS Cognito 解析经过身份验证的 IdentityId 吗?

    我有一个支持 Cognito 未经身份验证的身份的 JavaScript Web 应用程序 我正在尝试找出如何识别链接的经过身份验证的 IdentityIdDISABLED未经身份验证的 IdentityId 第一个未经身份验证的用户通过以
  • 如何保护我的登录页面

    我有一个 login html 网页 让用户输入他的用户名和密码 当他单击 提交 时 我使用 Javascript 收集输入的值 然后对 php 文件进行 Ajax POST 调用并发送用户名和密码 我担心的是 这是发送用户名和密码的安全方
  • REST 数字或字符串资源标识符?

    我正在做一些研究来帮助我开发 REST API 这是我在任何地方都没有看到过深入讨论的主题 如果系统中有用户 使用数字标识符来识别用户是否更好 users 1 或者使用字符串标识符 用户 RSmith 我可以看到每种方法的假设潜在优点和缺点
  • 如何查看gdb内部智能指针的内部数据?

    我有如下测试程序 include
  • C演员的真正作用是什么?

    我编写了越来越多的 C 应用程序 现在我对强制类型转换感到好奇 在 C 中 动态转换是一种非常昂贵的操作 例如向下转换 但我什至不知道静态转换 在 C 语言中 我必须写这样的东西 assert p p is void int v int p
  • 当 new 表达式的参数子表达式抛出异常时释放内存

    动态分析在我们的代码库中发现了奇怪的内存泄漏 有问题的代码如下所示 Something p new Something getArgument 其中函数getArgument 有时会抛出 当它抛出时 新分配的对象就会被泄漏 这是由 Visu
  • [Authorize(Users = "*")] 在 asp.net mvc 中意味着什么

    什么是 Authorize Users 在 asp net mvc 中是什么意思 还请解释一下 Authorize Users and Authorize Users Thanks 要授权所有用户 只需省略使用 Authorize 属性一并
  • 如何以编程方式更改 Windows 桌面壁纸? [复制]

    这个问题在这里已经有答案了 我想使用 C 为 Windows XP 设置壁纸 我已经开发了代码 因此它可以在 Windows 7 中完美运行 但显然对于 XP 来说并不相同 我将该壁纸添加为资源 将其编译操作设置为内容并始终复制 奇怪的是
  • 如何围绕节点的 Y 轴旋转 SKSpriteNode?

    我正在尝试围绕其 Y 轴旋转 SKSpriteNode 节点 我知道有 zRotation 属性 它将顺时针或逆时针旋转节点 然而 我想围绕它自己的 Y 轴旋转节点 例如跳舞的芭蕾舞演员 但我似乎找不到任何功能来这样做 最好的推荐方法是什么
  • 错误静态方法需要空实例,非静态方法需要非空实例

    我正在尝试创建一个表达式树 我需要从数据表中读取数据并检查其列 要检查的列以及要检查的列数仅在运行时已知 列名作为字符串数组提供给我 每列都有一个要检查的字符串列表 我尝试了示例表达式树 如下所示 我在这里遇到了一个错误 静态方法需要空实例
  • Keras-tuner 搜索函数抛出 Failed to create a NewWriteableFile 错误

    tensorflow 2 相对较新的 keras tuner 模块导致错误 无法创建 NewWriteableFile tuner search 函数正在运行 只有在试用完成后才会抛出错误 这是来自 senddex Youtube 频道的教
  • EJB 3 存根生成

    我有一个 ejb 3 兼容的 ejb 比如说 Remote interface Hai String sayHai Stateless name xxx mappedname yyy public class HaiImpl impleme
  • 如何访问weblogic 10.3.6中定义的JNDI数据源

    我已经使用 weblogic 控制台创建了 JNDI 数据源 但无法从 Web 应用程序访问该对象 以下是详细信息 在 weblogic 10 3 6 中 我将数据源的 JNDI 名称指定为 jdbc mydb 为了从我的 Web 应用程序
  • 如何使用 DataTemplate 访问列表框中的特定项目?

    我有一个 ListBox 其中包含一个带有 2 个 StackPanel 的 ItemTemplate 我想访问的第二个 StackPanel 中有一个 TextBox 将其可见性更改为 true 并接受用户输入 触发器应该是 Select