2011-06-15 10 views
5

मैं एमवीवीएम डिज़ाइन पैटर्न के दौरान रखते हुए डेटा ग्रिड सेल में परिवर्तनों को संभालने का तरीका जानने का प्रयास कर रहा हूं। जब उपयोगकर्ता किसी सेल में मान बदलता है, तो मुझे नए सेल मान के आधार पर फ़ाइलों का एक समूह बंद करना और बदलना होगा। मुझे पता है कि मैं कोड के पीछे आसानी से ऐसा कैसे कर सकता हूं, लेकिन क्या कमांड बाइंडिंग के साथ ऐसा करने के लिए एक क्लीनर, अधिक एमवीवीएम-एस्क्यू तरीका है?एमवीवीएम के साथ डेटा ग्रिड सेल परिवर्तनों को आप कैसे प्रबंधित करते हैं?

उत्तर

2

मान लेते हैं अपने DataGrid के ItemsSource अपने ViewModel में ही है, TwoWay मोड, कुछ करने के लिए करते हैं, चलो यह CustomObject या जो कुछ भी संपर्क कर सकें।

के तत्कालीन मान लेते हैं कि एक विशिष्ट DataGridCellSomeProperty नाम के एक संपत्ति है, जो इस प्रकार है घोषित किया जाता है करने के लिए बाध्य कर रहा है:

private string someProperty; 
public string SomeProperty { 
    get { return someProperty; } 
    set { 
    someProperty = value; 
    //Fire OnPropertyChanged here 
    } 
} 

सिर्फ सेट पर एक ब्रेकपाइंट रखो। फिर, अपने दृश्य में सेल को संशोधित करें: ब्रेकपॉइंट पहुंच जाएगा।

यह आपको एक कार्यक्रम अनुकरण करने की अनुमति देता है: प्रत्येक बार सेट कहलाता है, इसका मतलब है कि सेल बदल जाएगा, जो भी आप बदलते प्रक्रिया के साथ अब भी चाहते हैं (उदाहरण के लिए आप value पर परीक्षण करके नए मान का परीक्षण कर सकते हैं , या someProperty को लाइन से पहले कहीं भी someProperty बचाकर)

+0

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

12

आमतौर पर मैं गैलासोफ्ट से इंटरैक्शन ट्रिगर्स के साथ ऐसा करता हूं।

<DataGrid IsReadOnly="False"> 
      <e:Interaction.Triggers> 
       <e:EventTrigger EventName="CellEditEnding"> 
        <GalaSoft_MvvmLight_Command:EventToCommand PassEventArgsToCommand="True" Command="{Binding CellEditEndingCommand}"/> 
       </e:EventTrigger> 
      </e:Interaction.Triggers> 
     <DataGrid.Columns> 
       ...       
    </DataGrid.Columns> 
</DataGrid> 

फिर व्यूमोडेल के अंदर आप जेनेरिक रिलेकॉमंड बनाते हैं जहां सामान्य प्रकार संबंधित EventArgs का प्रकार होता है।

RelayCommand<DataGridCellEditEndingEventArgs> CellEditEndingCommand {get; set;} 

प्रारंभ:

CellEditEndingCommand = new RelayCommand<DataGridCellEditEndingEventArgs>(args=>DoSomething()); 
+1

+1 क्योंकि यह आम तौर पर ऐसा करने का तरीका है, हालांकि आपको गैलासोफ्ट के संस्करण का उपयोग करने की आवश्यकता नहीं है। PRISM के पास वीएम कमांड्स को ईवेंट बाध्य करने का भी एक तरीका है, या आप http://marlongrech.wordpress.com/2008/12/04/attachedcommandbehavior-aka-acb/ – Rachel

+0

जैसे कस्टम इम्प्लांटेशन पा सकते हैं या आप एक प्रतिनिधिमंडल आधारित बना सकते हैं CellEditEnding ईवेंट – skjagini

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

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