如何引用ItemsControl生成的Label元素并实现点击动态页面跳转?
实现方案
一、通过绑定对象获取ID(无需查找Label控件)
WPF中ItemsControl动态生成的模板控件无法直接通过x:Name引用,最可靠的方式是直接获取点击项绑定的CatModel对象,步骤如下:
- 修改
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
相关产品推荐
相关产品推荐

