对话框(WPF)中的空标签内容

对话框(WPF)中的空标签内容,wpf,null,dialog,label,box,Wpf,Null,Dialog,Label,Box,我是WPF的初学者。我有一个带有主窗口和对话框的应用程序。当我打开“加载”对话框时,我将一个数字(从数据库中提取)放在对话框中标签的内容中。一切都进行得很顺利,我可以在对话框的标签中看到提取的数字,但当我试图使用它在对话框中提取一些数据时,WPF说标签内容为空。 我把一个数字作为idNum的内容。它工作正常。所以我认为我的代码没有问题,但我不明白为什么它是“null”,尽管它显示在dlg.lbId中 在主窗口的代码隐藏中,我有: private void btManage_Click(o

我是WPF的初学者。我有一个带有主窗口和对话框的应用程序。当我打开“加载”对话框时,我将一个数字(从数据库中提取)放在对话框中标签的内容中。一切都进行得很顺利,我可以在对话框的标签中看到提取的数字,但当我试图使用它在对话框中提取一些数据时,WPF说标签内容为空。 我把一个数字作为idNum的内容。它工作正常。所以我认为我的代码没有问题,但我不明白为什么它是“null”,尽管它显示在dlg.lbId中

在主窗口的代码隐藏中,我有:

    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();
    }