从 1 table 绑定 DataGridComboBoxColumn,从另一个 table 选择值

Binding DataGridComboBoxColumn from 1 table, selected value from another table

我无法在数据网格上绑定 DataGridComboBoxColumn。简而言之,我想做的是,我在数据网格上有 3 行,第一行(DataGridTextColumn)显示 Table1 中的 GrupName,第二行(DataGridComboBoxColumn)显示 Table2 中的 PrinterNames,但是从 Table1 中选择的值(PrinterID),第三行(DataGridComboBoxColumn)显示 TaxRates从表 3 中,从表 1 中选择值

因此数据网格将显示为;

  Group Name      Printer Name    Tax Rate
--------------------------------------------
    Pizza         Pizza Printer       8 
    Salad         Salad Printer       8 
    Beverage      No Printer          8 

Table 1            Table 2            Table3
--------       ---------------      ----------
id                  id                  id    
GroupName       PrinterName          TaxRate
PrinterID
TaxID

打印机名称和税率将成为 DataGridComboBoxColumn。我计划使用 ObservableCollection,因此当用户通过从 DataGridComboBoxColumn 中选择将 "Printer" 更改为 "Pizza" 时,我能够保存更改。

提前致谢。

在我尝试了几件事之后,我使用了以下解决方案并且它对我有用,但我不知道它有多专业。这是我的解决方案;

我的XAML代码是

<DataGrid AutoGenerateColumns="False" Name="urunGrublariGrid" CanUserAddRows="False">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Grup Adi" Binding="{Binding Path=grup_adi}"></DataGridTextColumn>
                        <DataGridComboBoxColumn Header="Yazici" Width="100" x:Name="yazicilar" DisplayMemberPath="adi" SelectedItemBinding="{Binding yazici_listesi}" 
                                                SelectedValueBinding="{Binding yazici_id}" SelectedValuePath="id"></DataGridComboBoxColumn>
                        <DataGridComboBoxColumn Header="Vergi Dilimi" Width="100" x:Name="vergiler" DisplayMemberPath="vergi_orani" SelectedItemBinding="{Binding yazici_listesi}" 
                                                SelectedValueBinding="{Binding vergi_id}" SelectedValuePath="id"></DataGridComboBoxColumn>
                    </DataGrid.Columns>
 </DataGrid>

XAML.Cs代码

    public partial class UrunIslem : Window
{
    public static ObservableCollection<UrunGrubu> urun_grubu_listesi { get; set; }
    public static ObservableCollection<Yazici> yazici_listesi { get; set; }
    public static ObservableCollection<Vergi> vergi_listesi { get; set; }

    public UrunIslem()
    {
        InitializeComponent();
        Urun_Grubu_Islemleri();
    }
    private void Urun_Grubu_Islemleri()
    {
        UrunGrubu ug = UrunGrubu.tum_gruplar();
        urun_grubu_listesi = new ObservableCollection<UrunGrubu>(UrunGrubu.urun_gruplari());
        urun_grubu_listesi.Add(new UrunGrubu { grup_adi = ug.grup_adi, yazici_id= ug.yazici_id, urun_turu_id= ug.urun_turu_id, vergi_id = ug.vergi_id });

        Yazici yzc = Yazici.yazicilar();
        yazici_listesi = new ObservableCollection<Yazici>(Yazici.tum_yazicilar());
        yazici_listesi.Add(new Yazici { adi = yzc.adi, id = yzc.id});

        Vergi vrg = Vergi.tum_vergileri_getir();
        vergi_listesi = new ObservableCollection<Vergi>(Vergi.tum_vergiler());
        vergi_listesi.Add(new Vergi { id = vrg.id, vergi_orani = vrg.vergi_orani });

        urunGrublariGrid.ItemsSource = urun_grubu_listesi;
        yazicilar.ItemsSource = yazici_listesi;
        vergiler.ItemsSource = vergi_listesi;

    }

}

UrunGrubu Class代码是;

  public class UrunGrubu
{
    public int id { get; set; }
    public string grup_adi { get; set; }
    public int yazici_id { get; set; }
    public int urun_turu_id { get; set; }
    public int resim_id { get; set; }
    public int vergi_id { get; set; }
    public bool etkin { get; set; }
    public DateTime ekleme_tarihi { get; set; }
    public static UrunGrubu tum_gruplar()
    {
        UrunGrubu grup = new UrunGrubu();

        try
        {
            SqlCommand cmd = new SqlCommand("SELECT * FROM UrunGrubu WHERE etkin = 1", Genel.baglan());
            SqlDataReader rdr = cmd.ExecuteReader();
            if (rdr.Read())
            {
                grup.id = Convert.ToInt32(rdr["id"]);
                grup.grup_adi = rdr["grup_adi"].ToString();
                grup.yazici_id = Convert.ToInt32(rdr["yazici_id"]);
                grup.urun_turu_id = Convert.ToInt32(rdr["urun_turu_id"]);
                grup.resim_id = Convert.ToInt32(rdr["resim_id"]);
                grup.vergi_id = Convert.ToInt32(rdr["vergi_id"]);
                grup.etkin = Convert.ToBoolean(rdr["etkin"]);
                grup.ekleme_tarihi = Convert.ToDateTime(rdr["ekleme_tarihi"]);
            }
        }
        catch (Exception ex)
        {
            Genel.log("Tum Urun Gruplarini Getir Fonkisyonu", ex.Message);
            throw;
        }
        return grup;

    }

    public static List<UrunGrubu> urun_gruplari()
    {
        List<UrunGrubu> urun_grub_listesi = new List<UrunGrubu>();
        try
        {
            SqlCommand cmd = new SqlCommand("SELECT * FROM UrunGrubu WHERE etkin = 1", Genel.baglan());
            SqlDataReader rdr = cmd.ExecuteReader();

            while (rdr.Read())
            {
                UrunGrubu eleman = new UrunGrubu();

                eleman.id = Convert.ToInt32(rdr["id"]);
                eleman.grup_adi = Convert.ToString(rdr["grup_adi"]);
                eleman.yazici_id = Convert.ToInt32(rdr["yazici_id"]);
                eleman.urun_turu_id = Convert.ToInt32(rdr["urun_turu_id"]);
                eleman.resim_id = Convert.ToInt32(rdr["resim_id"]);
                eleman.vergi_id = Convert.ToInt32(rdr["vergi_id"]);
                eleman.ekleme_tarihi = Convert.ToDateTime(rdr["ekleme_tarihi"]);
                urun_grub_listesi.Add(eleman);
            }

        }
        catch (Exception ex)
        {
            Genel.log("Urun Grubu Getir", ex.Message);
            throw;
        }
        return urun_grub_listesi;
    }

}

我的另一个 class 是这样称呼 Vergi 的;

public class Vergi
    {
        public int id { get; set; }
        public int  vergi_orani {get; set;}
        public bool etkin {get; set;}
        public DateTime ekleme_tarihi {get;set;}
        public static Vergi tum_vergileri_getir()
        {

            Vergi vergiler = new Vergi();

            try
            {
                SqlCommand cmd = new SqlCommand("SELECT * FROM Vergi WHERE etkin = 1", Genel.baglan());
                SqlDataReader rdr = cmd.ExecuteReader();
                if (rdr.Read())
                {
                    vergiler.id = Convert.ToInt32(rdr["id"]);
                    vergiler.vergi_orani = Convert.ToInt32(rdr["vergi_orani"]);
                    vergiler.etkin = Convert.ToBoolean(rdr["etkin"]);
                    vergiler.ekleme_tarihi = Convert.ToDateTime(rdr["ekleme_tarihi"]);
                }
            }
            catch (Exception ex)
            {
                Genel.log("Tum vergileri getir", ex.Message);
                throw;
            }
            return vergiler;

        }
        public static List<Vergi> tum_vergiler()
        {
            List<Vergi> vergiler = new List<Vergi>();
            try
            {
                SqlCommand cmd = new SqlCommand("SELECT * FROM Vergi WHERE etkin = 1", Genel.baglan());
                SqlDataReader rdr = cmd.ExecuteReader();

                while (rdr.Read())
                {
                    Vergi vrg = new Vergi();

                    vrg.id = Convert.ToInt32(rdr["id"]);
                    vrg.vergi_orani = Convert.ToInt32(rdr["vergi_orani"]);
                    vrg.etkin = Convert.ToBoolean(rdr["etkin"]);
                    vrg.ekleme_tarihi = Convert.ToDateTime(rdr["ekleme_tarihi"]);
                    vergiler.Add(vrg);
                }

            }
            catch (Exception ex)
            {
                Genel.log("Tum vergiler listesi", ex.Message);
                throw;
            }
            return vergiler;
        }

    }

我厌烦的是使用 DataGridComboBoxColumn,它显示来自 db table 的 "Vergi" 列表,称为 "Vergi",但是从另一个 [=33] 中选择了 "Vergi" 值=] 即 "UrunGrubu"。我希望这个解决方案也能帮助其他人。