ข้อความที่ป้อนใน WPF DatagridTextboxColumn และค่าที่เลือกใน DatagridComboboxColumn จะไม่แสดงเมื่อโฟกัสหายไป

คำถามของฉันอาจดูซ้ำไปซ้ำมาเนื่องจากมีคำถามที่คล้ายกันใน StackOverflow เช่น

https://stackoverflow.com/questions/5733782/how-to-retain-value-in-datagridcomboboxcolumn-of-wpfs-datagrid

https://stackoverflow.com/questions/6101441/creating-wpf-datagrid-dynamically-with-dynamically-created-drop-down-box-using-d

แต่ฉันไม่พบคำตอบที่ตรงกับความต้องการของฉัน

ฉันสร้าง WPF datagrid แบบไดนามิกซึ่งรับคอลัมน์จากไฟล์ข้อมูลเมตา (excel) ตามเงื่อนไขบางประการ DataGrid จำเป็นต้องเป็นแบบทั่วไป ดังนั้นฉันจึงไม่สามารถผูก Datagrid เองระหว่างการสร้างได้ ฉันผูกคอลัมน์ DatagridCombobobox แบบไดนามิกและสามารถรับค่าในคอลัมน์เหล่านั้นได้เช่นกัน

ตอนนี้ปัญหาของฉันคือ เมื่อฉันเลือกค่าใน DatagridCombobobox หรือป้อนข้อความใน DatagridTextboxColumn แล้วย้ายไปยังเซลล์/แถวอื่น ข้อความและส่วนที่เลือกนี้จะหายไป

ฉันจะเปิดใช้งานเซลล์/แถว Datagrid เพื่อจดจำข้อความที่ป้อนหรือการเลือกแบบไดนามิกได้อย่างไร ฉันตรวจสอบคำตอบของคำถามที่คล้ายกันใน เซลล์ DataGridComboBoxColumn ไม่แสดงข้อความรายการที่เลือก ? แต่สำหรับ DataGrid แบบคงที่ เนื่องจากการสร้าง DataGrid ของฉันเป็นแบบไดนามิก ฉันจึงไม่รู้วิธีใช้โซลูชันนี้ กรุณาช่วย. ฉันติดอยู่กับสิ่งนี้และมันใช้เวลานานมาก :(

ขอแสดงความนับถือ Niranjan.

การสร้าง DataGrid แบบไดนามิก:

    Dim setupGrid = "<my:DataGrid AutoGenerateColumns='False' Name='grdSetup' " & "xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'" & "  xmlns:sdk = 'http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk'" & "  xmlns:x = 'http://schemas.microsoft.com/winfx/2006/xaml'" & "  xmlns:TAB = 'http://fabtab.codeplex.com'" & "   xmlns:my='http://schemas.microsoft.com/wpf/2008/toolkit' " & " >"
    setupGrid = setupGrid & "<my:DataGrid.Columns>"
    ...
    ...
    ...
    setupGrid = setupGrid & "</my:DataGrid.Columns>"

    setupGrid = setupGrid & "</my:DataGrid>"

    Dim sr = New MemoryStream(Encoding.ASCII.GetBytes(setupGrid))
    Dim pc = New ParserContext()
    pc.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation")
    pc.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml")
    Dim grdElement As UIElement = DirectCast(System.Windows.Markup.XamlReader.Load(sr, pc), UIElement)
    Dim grdSetup As DataGrid = DirectCast(grdElement, DataGrid)

รหัส DataGridCombobox ของฉันคล้ายกัน:

    setupGrid = setupGrid & "<my:DataGridComboBoxColumn x:Name='" & dr.Item("ParameterName").ToString.Trim & "'  Header='" & dr.Item("ParameterName") & "'  SelectedValuePath='" & dr.Item("ValueColumn") & "' DisplayMemberPath='" & dr.Item("DisplayColumn") & "'  />"

ค่าสตริงนี้จะถูกเพิ่มลงในสตริง DataGrid ด้านบนและแปลงเป็น UIElement ดังที่แสดงในโค้ด DataGrid ด้านบน ฉันเพิ่ม Datagrid ของฉันไปยัง ItemsControl แบบไดนามิก:

    Me.DynamicContent.Items.Add(grdElement)

โดยที่ DynamicContent คือ ItemsControl

ในเหตุการณ์ UserControl_Loaded ฉันค้นหา ComboBox แต่ละรายการใน Datagrid ของฉันผ่าน:

    Dim dynamicGrid as DataGrid = DynamicContent.ItemContainerGenerator.ContainerFromIndex(0)
    Dim comboColumns = dynamicGrid.Columns.OfType(Of DataGridComboBoxColumn)()
    For index As Integer = 0 To comboColumns.Count - 1
     comboColumns(index).ItemsSource = DirectCast(dt, IListSource).GetList()
    Next

โดยที่ dt เป็น Datatable ซึ่งประกอบด้วยข้อมูลที่จะอยู่ใน ComboBox ของฉัน มันมีเส้นทาง SelectedValuePath และ DisplayMember ของคอมโบบ็อกซ์เป็นคอลัมน์

ฉันไม่สามารถตั้งค่า SelectedItemBinding และ SelectedValueBinding สำหรับ DatagridComboboxColumn ก่อนมือได้ เนื่องจากเป็นไดนามิกและแตกต่างกันไปสำหรับ ComboColumns ที่แตกต่างกัน ฉันไม่รู้ว่าสามารถตั้งค่าสิ่งเหล่านี้ในเหตุการณ์ที่โหลดข้างต้นได้อย่างไร โปรดแจ้งให้เราทราบว่าฉันทำอะไรผิด? หรือสิ่งที่สามารถทำได้เพื่อที่จะสามารถรักษาคุณค่าไว้ได้แม้จะสูญเสียโฟกัสไปก็ตาม ขออภัยที่อธิบายยาว :(


person Adrian T    schedule 17.11.2011    source แหล่งที่มา
comment
กรุณาโพสต์ XAML/รหัสสำหรับ ComboBox ของคุณ ฉันเดาได้ดีที่สุดว่าคุณไม่ได้ผูกมัด SelectedItem, SelectedIndex หรือ SelectedValue ดังนั้นการเลือกของคุณจึงไม่ได้รับการบันทึก   -  person Rachel    schedule 17.11.2011