You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何引用ItemsControl生成的Label元素并实现点击动态页面跳转?

实现方案

一、通过绑定对象获取ID(无需查找Label控件)

WPF中ItemsControl动态生成的模板控件无法直接通过x:Name引用,最可靠的方式是直接获取点击项绑定的CatModel对象,步骤如下:

  1. 修改Cat_Click事件代码:
private void Cat_Click(object sender, MouseButtonEventArgs e)
{
    // 获取点击的Card控件
    var card = sender as MaterialDesignThemes.Wpf.Card;
    if (card == null) return;
    
    // 获取绑定的CatModel数据对象
    var catModel = card.DataContext as CatModel;
    if (catModel == null) return;
    
    // 将分类ID写入全局变量
    global.catid = catModel.ID;
    
    // 打开新页面(替换成你的实际页面类名)
    var detailPage = new CategoryDetailPage();
    detailPage.Show();
    // 若使用Frame导航,改用:NavigationService.Navigate(detailPage);
}

二、优化新页面数据查询(规避SQL注入风险)

原代码用字符串拼接SQL存在注入漏洞,必须改用参数化查询,同时通过全局变量获取ID:

InitializeComponent();
DB db = new DB();

// 参数化查询,避免SQL注入
string query = "SELECT FirstName, LastName, ID, img FROM Login WHERE ID = @UserId";
MySqlCommand cmd = new MySqlCommand(query, db.GetConnection());
// 添加查询参数
cmd.Parameters.AddWithValue("@UserId", global.userid);

try
{
    db.openConnection();
    using (MySqlDataReader myReader = cmd.ExecuteReader())
    {
        // 单条数据用if即可,无需while循环
        if (myReader.Read())
        {
            FN_Label.Content = myReader.GetString("FirstName");
            LN_Label.Content = myReader.GetString("LastName");
        }
    }
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
    // 可添加用户友好提示,避免直接抛出异常
}
finally
{
    // 确保数据库连接关闭,防止资源泄漏
    db.closeConnection();
}

三、修正初始分类列表加载代码

原代码错误地直接引用Cat_Label拼接SQL,改为通过全局变量+参数化查询实现:

List<CatModel> items = new List<CatModel>();
DB db = new DB();

// 必须查询ID字段,否则绑定的ID属性为空
string query = "SELECT ID, Cat_Name, Description FROM Category WHERE ID = @CatId";
MySqlCommand cmd = new MySqlCommand(query, db.GetConnection());
cmd.Parameters.AddWithValue("@CatId", global.catid);

try
{
    db.openConnection();
    using (var rd = cmd.ExecuteReader())
    {
        while (rd.Read())
        {
            items.Add(new CatModel() 
            { 
                ID = rd.GetInt32("ID"),
                Cat_Name = rd.GetString("Cat_Name"),
                Description = rd.GetString("Description")
            });
        }
    }
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
}
finally
{
    db.closeConnection();
}
icCatList.ItemsSource = items;

四、关键注意事项

  • 确保CatModel类包含ID属性,否则绑定和点击获取都会失败:
public class CatModel
{
    public int ID { get; set; }
    public string Cat_Name { get; set; }
    public string Description { get; set; }
}
  • 全局变量类global建议改为规范命名(如GlobalData),符合C#命名约定。
  • 所有数据库操作必须在finally块中关闭连接,避免连接池耗尽。

内容的提问来源于stack exchange,提问作者Fainer Game

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 22:35:11