में बाध्यकारी मैं प्रोग्रामिंग के DataGrid
बना रहा हूं और ComboBoxColumns
का भी समर्थन करना चाहता हूं।डेटाग्रिडबॉन्क्सकॉलम को डेटाग्रिड के आइटमसोर्स में सी #
DataGrid
बनाने के बाद, मैंने को BindableList<BindableDictionary>
के संग्रह के संग्रह में सेट किया है। BindableDictionary
एक कस्टम प्रकार है। प्रत्येक BindableDictionary
एक टुपल का प्रतिनिधित्व करता है। यह कुंजी हमेशा कॉलम का नाम है और इसका मान एक कस्टम क्लास है जिसमें ActualValue
नामक एक सामान्य संपत्ति होती है, Dictionary<T, string>
AllowedValues
और boolean
कहा जाता है जो निर्धारित करता है कि का उपयोग ComboBoxColumn
या 'सामान्य' कॉलम बनाने के लिए किया जाएगा। यह वर्ग INotifyPropertyChanged
और INotifyPropertyChanging
लागू करता है।
वह सामान काम करता है, कॉम्बोबॉक्स कॉलम, डुह से अलग करता है। ComboBoxColumn के साथ मेरी समस्या मैं यह कैसे AllowedValues
वस्तु का उपयोग करने के लिए यह ItemList है और सही Value
AllowedValues
BindableDictionary
से चयन करने के लिए पाठ क्षेत्र को भरने के लिए ActualValue
संपत्ति का उपयोग भरने के लिए प्राप्त करने के लिए पता नहीं है कि है।
table.Columns.Add(new DataGridTextColumn() { Header = column.GUIName, DisplayIndex = column.Position, Binding = new Binding(column.Name + ".ActualValue") { UpdateSourceTrigger = UpdateSourceTrigger.Default, Mode = BindingMode.TwoWay, NotifyOnTargetUpdated = true, NotifyOnSourceUpdated = true, UpdateSourceExceptionFilter = new UpdateSourceExceptionFilterCallback(BindingExceptionHandler) } });
और हाँ, कि काम करता है:
उदाहरण के लिए, यह कैसे मैं एक textbased स्तंभ के लिए बाध्य है।
मैं column.AllowedValues
को DataGridComboBoxColumn
की ItemsSource
गुण सेट और DisplayPath
"Value"
है जो कम से कम सही सामग्री को प्रदर्शित करने के लिए सेट करने की कोशिश की, लेकिन मैं कोई सुराग नहीं कैसे ActualValue
संपत्ति है कि DataGrid
में निहित है करने के लिए बाध्य करने के लिए है ItemsSource
है। इसके अलावा इसका मतलब यह होगा कि कॉलम के अंदर सभी कोशिकाएं एक ही चयन योग्य मान साझा करती हैं, जो भविष्य में समस्याओं का कारण बन सकती है।
और यदि मैं DataGridTextColumn
में किए गए सबकुछ को बांधने का प्रयास करता हूं, तो कुछ भी प्रदर्शित नहीं होता है। इसके अलावा चयन करने के लिए कोई आइटम नहीं हैं।
यह बहुत ही अच्छा होगा अगर किसी के पास इस बात का संकेत हो कि मैं कोशिश कर सकता हूं।
संपादित
बस इस देखा: https://stackoverflow.com/a/2197004/937093, मुझे लगता है कि कोशिश की, लेकिन तब मैं मेरी उत्पादन विंडो में निम्न संदेश:
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=AllowedValues; DataItem=null; target element is 'DataGridComboBoxColumn' (HashCode=33493530); target property is 'ItemsSource' (type 'IEnumerable')
मेरे कोड इस तरह दिखता है:
col = new DataGridComboBoxColumn() { Header = column.GUIName, SelectedValueBinding = new Binding(column.Name + ".ActualValue"), SelectedValuePath = "ActualValue" };
table.Columns.Add(col);
BindingOperations.SetBinding(col, DataGridComboBoxColumn.ItemsSourceProperty, new Binding("AllowedValues"));
संपादित 2 ठीक है, यह पाया वेबसाइट: http://www.thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/
मैं प्रॉक्सी बंधन सामान लागू करने के लिए (भले ही मैं कैसे कॉलम डेटा ग्रिड ... और कहाँ यह होगा ?! के दृश्य पेड़ के हिस्सा नहीं है नहीं मिलता है) की कोशिश की लेकिन यह काम नहीं करेगा।मेरे कोड:
BindingProxy proxy = new BindingProxy() { Data = table.ItemsSource };
table.Resources.Add("proxy", proxy });
col = new DataGridComboBoxColumn() { Header = column.GUIName, SelectedValueBinding = new Binding("Data." + column.Name + ".ActualValue") { Source = proxy }, DisplayMemberPath = "Value", SelectedValuePath = "Key" };
table.Columns.Add(col);
BindingOperations.SetBinding(col, DataGridComboBoxColumn.ItemsSourceProperty, new Binding("Data." + column.Name + ".AllowedValues") });
उत्पादन विंडो में आउटपुट:
System.Windows.Data Error: 40 : BindingExpression path error: 'MyColumn' property not found on 'object' ''BindingList`1' (HashCode=55207835)'. BindingExpression:Path=Data.MyColumn.ActualValue; DataItem='BindingProxy' (HashCode=45660050); target element is 'TextBlockComboBox' (Name=''); target property is 'SelectedValue' (type 'Object')
मैं समस्या को समझने (यह BindingList में 'MyColumn' वस्तु खोजने की कोशिश कर रहा है), लेकिन मुझे समझ नहीं आता क्यों कि क्या हो रहा है (इसे बाध्यकारी सूची [iterator] ["MyColumn"] को हल करना चाहिए, क्योंकि बाइंडिंगलिस्ट में बाइंडेबल डिक्शनरी है और यह मेरे 'सामान्य' कॉलम के लिए बिल्कुल होता है)।