Saya seorang pemula di WPF. Saya memiliki aplikasi dengan jendela utama dan kotak dialog. Ketika saya kotak dialog memuat, saya meletakkan nomor (diambil dari database) dalam konten label di kotak dialog saya. Semuanya berjalan dengan baik, dan saya dapat melihat nomor yang diambil, dalam label kotak dialog, tetapi ketika saya mencoba menggunakannya untuk mengambil beberapa data di kotak dialog saya, WPF mengatakan konten label adalah nol. Saya menempatkan nomor sebagai konten IDNUM. Itu bekerja dengan baik. Jadi saya pikir tidak ada masalah untuk kode saya, tetapi saya tidak mengerti mengapa itu "null" meskipun ditampilkan di dlg.lbid.

Dalam kode saya di belakang jendela utama saya, saya punya:

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

Dan dalam kode di belakang kotak dialog yang saya miliki:

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

    }
0
Moha 5 April 2021, 00:43

2 jawaban

Jawaban Terbaik

Masalahnya bisa jadi Anda mencoba membaca lbId.Content sebelum benar-benar diatur. Cobalah untuk memindahkan pemuatan data dari konstruktor CarsDialog ke metode mari LoadData. Panggil LoadData sebelum ShowDialog. Anda dapat menyingkirkan baris lvCars.ItemsSource = (from c in ctx.Cars select c).ToList<Car>(); dan menyimpan hanya permintaan kedua.

Kode CarsDialog di belakang:

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

Kode mainwindow di belakang:

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();
}
0
user2250152 5 April 2021, 06:15

Kesalahan terbesar menyangkut pelanggaran prinsip OOP. Semua elemen UI dari sebuah jendela adalah detail pribadi dari implementasinya dan harus dienkapsulasi. Untuk komunikasi publik, Anda harus mendeklarasikan metode dan properti publik.

Dan detail yang lebih kecil. Mengapa Anda menggunakan label dan bukan TextBlock untuk menampilkan teks biasa?

Contoh dari implementasi yang lebih benar (bagian dari kode yang terkait dengan pertanyaan):

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

Menggunakan:

    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();
    }
0
EldHasp 5 April 2021, 06:55