2010-08-06 13 views
5

मुझे एक XamDataGrid बनाना है जो समय सीमा x से y के लिए गतिशील मात्रा दिखाता है। इसलिए मुझे नहीं पता कि उपयोगकर्ता इन स्तंभों को पहले से बनाए रखने के लिए कितने साल का चयन करेगा।एमवीवीएम - xamdatagrid के लिए रनटाइम पर कॉलम कैसे बनाएं?

अब सामान्य रूप से एमवीवीएम के भीतर आप केवल कई गुणों के माध्यम से डेटा को पॉप्युलेट करेंगे क्योंकि आपको अपने XamDataGrid के कॉलम की आवश्यकता होगी, और बाद वाले उन्हें केवल स्वतः उत्पन्न कर देंगे।

स्पष्ट रूप से मैं केवल रनटाइम पर अपने व्यूमोडेल के भीतर गुण नहीं बना सकता जब तक कि मैंने प्रतिबिंब के साथ कुछ पागल नहीं किया।

मैं इसे और कैसे प्राप्त करूं?

क्या मुझे सिर्फ डाटाग्रिड के लिए अनबाउंड फ़ील्ड बनाना चाहिए और उन्हें कोड के माध्यम से भरना चाहिए? मैं मानता हूं कि इस चरण में मुझे दो तरह की बाध्यकारी की आवश्यकता नहीं है, क्योंकि ग्रिड केवल पढ़ने के लिए है ... बस जोर से सोच रहा है।

क्या यह दृष्टिकोण एमवीवीएम पैटर्न का उल्लंघन किए बिना ठीक है? धन्यवाद

उत्तर

4

आप indexers उपयोग कर सकते हैं:

अपने ViewModel में:

public MyVariableCollection RowData 
{ 
    get { return new MyVariableCollection(this); } 
} 

MyVariableCollection में: संरक्षित SomeRowViewModel ViewModel;

public MyVariableCollection(SomeRowViewModel viewmodel) 
{ 
    this.viewModel = viewmodel; 
} 

public object this[string name] 
{ 
    get { return viewModel.GetRowColumnValue(name); } 
} 

मैं इसे संक्षिप्त बनाने का प्रयास किया परन्तु विचार यह है कि आप एक इंडेक्सर परिभाषित के साथ एक नया वर्ग है, तो आप इस तरह बाध्य कर सकते हैं:

{Binding Path=SomeRowViewModelInstance.RowData["ColumnName"]} 

पर स्तंभ संग्रह डेटा ग्रिड नियंत्रण बाध्य होगा - और आप प्रश्न में कॉलम से जुड़ने के लिए प्रत्येक कॉलम के लिए कॉलम टेम्पलेट सेट कर सकते हैं; आपको इंडेक्सर में एक शाब्दिक स्ट्रिंग का उपयोग करने की आवश्यकता नहीं है।

आशा है कि विचार के लिए कुछ भोजन प्रदान करें - इस मार्ग पर कोई भी प्रश्न कृपया एक टिप्पणी छोड़ दें। एक अतिरिक्त विचार के लिए


संपादित करें: मैं सामग्री ComponentModel नाम स्थान का इस्तेमाल किया है एक कस्टम TypeDescriptor निर्माण करने के लिए। यह गहराई से काफी है लेकिन आप अतिरिक्त या कस्टम गुण रखने के लिए ऑब्जेक्ट 'प्रकट' कर सकते हैं। यह ऊपर पोस्ट किए गए इंडेक्सर विधि से कहीं अधिक जटिल है, लेकिन यदि आप अटक जाते हैं तो यह एक लायक है।

+0

आपकी महान प्रतिक्रिया किरेन के लिए धन्यवाद। हालांकि मुझे आपके मॉडल के साथ तीन समस्याएं मिलीं। सबसे पहले ViewModel की रोडाटा संपत्ति है, जो अपने स्वयं के सीटीआर में 'यह' गुजर रही है। हालांकि वास्तविक ctor कुछ प्रकार के कुछ RowViewModel स्वीकार करता है जो पिछले 'इस' के प्रकार के साथ संगत नहीं है। – Houman

+0

दूसरी समस्या यह है कि आप एक कॉलम को बांधते हैं। XamDataGrid के भीतर आप आमतौर पर पूरे xamdatagrid को बाइंडिंगलिस्ट संग्रह में बाध्य करेंगे, एक पंक्ति उन पंक्तियों को स्वत: उत्पन्न करेगी। जब तक आप मैन्युअल रूप से कॉलम नहीं बनाते, तो आप वास्तव में प्रत्येक कॉलम से अलग-अलग बाध्य नहीं कर पाएंगे। – Houman

+0

तीसरी समस्या निम्न है, मैं timeperiod x से y के लिए गतिशील रूप से कॉलम नामों को स्वत: उत्पन्न कर सकता हूं, ताकि जैसा कि आपने सुझाव दिया था, मैं उन्हें इंडेक्सर में उपयोग कर सकता हूं। लेकिन बाध्यकारी कैंट अभी भी स्थिर xaml कोड पर हो सकता है। परिवर्तनीय तरीके से कॉलम नामों का उपयोग करने के लिए इसे xaml दृश्य के पीछे कोड में होना चाहिए। जब तक मैं यहाँ कुछ याद नहीं कर रहा हूं ... धन्यवाद – Houman

1

मुझे एक ही समस्या थी क्योंकि उपयोगकर्ता रनटाइम पर ग्रिड के कॉलम को परिभाषित करने में सक्षम था।

मैंने ग्राम डेटाग्रिड युक्त एक नियंत्रण लिखा और ग्रिड (यानी एक डेटा तालिका) के लिए मॉडल को बांधने के लिए डेटासोर्स निर्भरता संपत्ति का खुलासा किया।

हर बार स्रोत बदल (आप और PropertyChanged के लिए घटना श्रोताओं ग्रिड FieldLayoutInitializing घटना जोड़ सकते हैं) ग्रिड गतिशील अपने डेटा स्रोत साफ करने और रीसेट करके फिर से प्रस्तुत किया गया है:

private void ReRenderGrid() 
{ 
    XamDataGrid.FieldLayouts.Clear(); 
    XamDataGrid.ClearValue(DataPresenterBase.DataSourceProperty); 
    XamDataGrid.DataSource = DataSource.Data.DefaultView; 
} 

कॉलम के लिए कॉन्फ़िगर कर रहे रहे हैं

XamDataGrid.FieldLayoutInitializing += LayoutInitializing; 

हैंडलर:

निम्न इवेंट जो ग्रिड डेटा स्रोत के बाद xamdatagrid द्वारा उठाया जाता है पर एक ईवेंट हैंडलर द्वारा रीसेट किया जाता है
private void LayoutInitializing(object sender, FieldLayoutInitializingEventArgs e) 
{ 
    const string deletebuttonstyle = "DeleteButtonStyle"; 
    const string requiredinputvalue = "RequiredInputValue"; 
    const string optionalinputvalue = "OptionalInputValue"; 
    const string outputvalue = "OutputValue"; 

    var fieldLayout = e.FieldLayout; 
    fieldLayout.Fields.Clear(); 

    AddFields(DataSource.InColumns, requiredinputvalue, fieldLayout); 
    AddSplitter(fieldLayout); 
    AddFields(DataSource.OptionalInColumns, optionalinputvalue, fieldLayout); 
    AddSplitter(fieldLayout); 
    AddFields(DataSource.OutColumns, outputvalue, fieldLayout); 

    AddUnboundField(fieldLayout, string.Empty, GetStyle(deletebuttonstyle)); 
} 

मेरे मामले में डेटास्रोत में उपयोगकर्ता द्वारा कॉन्फ़िगर किए गए सभी कॉलम शामिल थे। AddFields प्रत्येक सूची प्रवेश के लिए इस प्रणाली को बुलाती है:

private void AddField(string name, Style style, FieldLayout fieldLayout) 
{ 
    var field = new Field {Name = name}; 
    field.Settings.LabelPresenterStyle = style; 
    field.Settings.CellValuePresenterStyle = GetStyle("StandardCellValueStyle"); 
    fieldLayout.Fields.Add(field); 
} 

AddSplitter और AddUnboundField इसी तरह से लागू किया जाता है।

+0

ज़ीबी, इन कोड स्निपेट के लिए बहुत बहुत धन्यवाद। मुझे यकीन है कि यह काम कर रहा है और यह वास्तव में वादा करता है। हालांकि ये सिर्फ कोड स्निपेट हैं। मैं राज्यों का पालन नहीं कर सकता। XamDataGrid.DataSource = DataSource.Data.DefaultView; इस मामले में डेटा क्या है, मुझे लगता है कि यह नहीं है। विधि AddFields आपके AddField से अलग हस्ताक्षर प्रतीत होता है। यह वास्तव में अभी तक स्पष्ट नहीं है कि यह कैसे काम करना चाहिए। एक साधारण कामकाजी उदाहरण की सराहना की जाएगी। – Houman

+0

मेरे उदाहरण में डेटासोर्स प्रॉपर्टी डेटा तालिका (डेटा संपत्ति) और उपयोगकर्ता द्वारा परिभाषित कॉलम को बनाए रखने वाले कस्टम प्रकार को संदर्भित करती है (वह 3 प्रकार के कोल्स, इनपुट, वैकल्पिक इनपुट और आउटपुट कोल्स को परिभाषित कर सकता है)। आपके ग्रिड के लिए डेटासोर्स के रूप में उपयोग करने के लिए आपके पास कुछ डेटा तालिका होनी चाहिए। इस तालिका को रीसेट करें। मैं अभी एक कामकाजी उदाहरण नहीं बना सकता क्योंकि कोड काम पर एक परियोजना से है। मैं देखूंगा कि मैं कल कर सकता हूं या नहीं। – Zebi

+0

धन्यवाद ज़ीबी, अत्यधिक सराहना की। – Houman

संबंधित मुद्दे