对话框(WPF)中的空标签内容
我是WPF的初学者。我有一个带有主窗口和对话框的应用程序。当我打开“加载”对话框时,我将一个数字(从数据库中提取)放在对话框中标签的内容中。一切都进行得很顺利,我可以在对话框的标签中看到提取的数字,但当我试图使用它在对话框中提取一些数据时,WPF说标签内容为空。 我把一个数字作为idNum的内容。它工作正常。所以我认为我的代码没有问题,但我不明白为什么它是“null”,尽管它显示在dlg.lbId中 在主窗口的代码隐藏中,我有:对话框(WPF)中的空标签内容,wpf,null,dialog,label,box,Wpf,Null,Dialog,Label,Box,我是WPF的初学者。我有一个带有主窗口和对话框的应用程序。当我打开“加载”对话框时,我将一个数字(从数据库中提取)放在对话框中标签的内容中。一切都进行得很顺利,我可以在对话框的标签中看到提取的数字,但当我试图使用它在对话框中提取一些数据时,WPF说标签内容为空。 我把一个数字作为idNum的内容。它工作正常。所以我认为我的代码没有问题,但我不明白为什么它是“null”,尽管它显示在dlg.lbId中 在主窗口的代码隐藏中,我有: private void btManage_Click(o
private void btManage_Click(object sender, RoutedEventArgs e)
{
var selected = lvOwnerCar.SelectedItem as Owner;
int selectedId = selected.Id;
string selectedName = selected.Name;
CarsDialog dlg = new CarsDialog();
dlg.lbName.Content = selectedName;
dlg.lbId.Content = selectedId;
dlg.Owner = this;
dlg.ShowDialog();
}
在对话框的代码隐藏中,我有:
public CarsDialog()
{
InitializeComponent();
ctx = new CarDbContext();
lvCars.ItemsSource = (from c in ctx.Cars select c).ToList<Car>();
int idNum = Convert.ToInt32(lbId.Content);
lvCars.ItemsSource = (from c in ctx.Cars where c.Owner.Id == idNum select c).ToList<Car>();
}
公共汽车对话()
{
初始化组件();
ctx=新的CarDbContext();
lvCars.ItemsSource=(从ctx.Cars中的c选择c.ToList();
int idNum=Convert.ToInt32(lbId.Content);
lvCars.ItemsSource=(来自ctx.Cars中的c,其中c.Owner.Id==idNum选择c.ToList();
}
问题可能是,您试图在设置lbId.Content之前读取它。尝试将加载数据从CarsDialog
的构造函数移动到方法,让我们LoadData
。在ShowDialog
之前调用LoadData
。您可以去掉行lvCars.ItemsSource=(从ctx.Cars中的c选择c.ToList()
并仅保留第二个查询
车辆对话代码隐藏:
public CarsDialog()
{
InitializeComponent();
}
public void LoadData()
{
ctx = new CarDbContext();
int idNum = Convert.ToInt32(lbId.Content);
lvCars.ItemsSource = (from c in ctx.Cars where c.Owner.Id == idNum select c).ToList<Car>();
}
private void btManage_Click(object sender, RoutedEventArgs e)
{
var selected = lvOwnerCar.SelectedItem as Owner;
int selectedId = selected.Id;
string selectedName = selected.Name;
CarsDialog dlg = new CarsDialog();
dlg.lbName.Content = selectedName;
dlg.lbId.Content = selectedId;
dlg.Owner = this;
dlg.LoadData();
dlg.ShowDialog();
}
最大的错误是违反OOP原则。窗口的所有UI元素都是其实现的私有细节,必须进行封装。 对于公共通信,必须声明公共方法和属性 还有一个小细节。 为什么使用标签而不是文本块来显示纯文本 更正确的实现示例(与问题相关的部分代码):
public class CarsDialog
{
public CarsDialog()
{
InitializeComponent();
ctx = new CarDbContext();
lvCars.ItemsSource = (from c in ctx.Cars select c).ToList<Car>();
}
private int _idNum;
public int IdNum
{
get => _idNum;
set
{
lbId.Content = _idNum = value;
ctx = new CarDbContext();
lvCars.ItemsSource = (from c in ctx.Cars where c.Owner.Id == idNum select c).ToList<Car>();
}
}
private string _nameCar;
public string NameCar
{
get => _nameCar;
set
{
lbName.Content = _nameCar = value;
}
}
}
private void btManage_Click(object sender, RoutedEventArgs e)
{
var selected = lvOwnerCar.SelectedItem as Owner;
int selectedId = selected.Id;
string selectedName = selected.Name;
CarsDialog dlg = new CarsDialog();
dlg.NameCar = selectedName;
dlg.IdNum = selectedId;
dlg.Owner = this;
dlg.ShowDialog();
}