2013-07-29 5 views
7

पर एक WPF डेटाग्रिड बाध्यकारी मैं अंग्रेजी में अच्छा नहीं हूं क्योंकि मैं मूल निवासी नहीं हूं। मैं माफी माँगता हूं अगर मैंने भाषा में गलतियां की हैं :)एक डेटाटेबल

मैं सी # और डब्ल्यूपीएफ में नया हूं और मैं दोवे में डेटाटेबल में एक डब्ल्यूपीएफ डाटाग्रिड बांधने की कोशिश कर रहा हूं। अब जब मैं डेटाग्रिड में मानों को संपादित करता हूं, तो डेटाटेबल में डेटा सही ढंग से बदल जाता है। कोड काम करता है और डेटा ग्रिड सब सही लगता है

OleDbDataAdapter adapter = new OleDbDataAdapter("a query", (a connection)); 
adapter.Fill(dataTable); 

: जब मैं निम्न कोड के साथ DataTable को भरने के लिए प्रयास करें। लेकिन जब मैं इसे आजमाता हूं:

dataTable.Rows[0][1] = (some object); 

प्रदर्शन मूल्य परिवर्तित नहीं होता है। मैं निम्नलिखित तरीके से डेटा ग्रिड में मूल्यों की जाँच करने की कोशिश:

MessageBox.Show((SomeDataGrid.Items[0] as DataRowView).Row[1].ToString()); 

और यह कोई समस्या नहीं पता चला है। मैं सोच रहा हूं कि प्रदर्शन मूल्य इस तरह क्यों हैं।

यहाँ XAML में मेरी DataGrid.CellStyle है:

<DataGrid.CellStyle> 
    <Style TargetType="DataGridCell"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="DataGridCell"> 
        <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="{TemplateBinding Background}"> 
         <DataGridDetailsPresenter HorizontalAlignment="Stretch" VerticalAlignment="Center" Content="{TemplateBinding Content}"/> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Style.Triggers> 
      <!-- triggers --> 
     </Style.Triggers> 
    </Style> 
</DataGrid.CellStyle> 

मैं कई दिनों के लिए इस समस्या पर अटक गया है। किसी भी मदद के लिए धन्यवाद!

+0

जब आप डेटा ग्रिड के लिए स्तंभ को परिभाषित, सुनिश्चित करें कि आप PropertyChanged – Sivakumar

उत्तर

0

दुर्भाग्य से, मैं DataRow औजार INotifyPropertyChanged या DataTable लागू करता INotifyCollectionChanged विश्वास नहीं है। ये इंटरफ़ेस हैं जो अंतर्निहित स्रोत मान में परिवर्तन करते समय अद्यतन करने के लिए WPF DataBinding बताते हैं। इसलिए जब आप अंतर्निहित DataTable मानों को अपडेट करते हैं, तो Binding स्वचालित रूप से रीफ्रेश नहीं होता है और परिवर्तन आपके DataGrid में दिखाई नहीं देगा।

This link एक समान प्रश्न के लिए अंक और एक उत्तर प्रदान करता है। असल में, यदि आप अंतर्निहित डेटा स्रोत में मानों को बदलते समय अपने DataGrid को पहचानने और अपडेट करने के लिए चाहते हैं, तो आपको INotifyPropertyChanged लागू करने वाली कस्टम ऑब्जेक्ट/ऑब्जेक्ट्स बनाने की आवश्यकता होगी।

+1

को UpdateMode संपत्ति की स्थापना कर रहे हैं afaik WPF रेखांकित DataView के लिए और इसलिए एक IBindingListView के लिए बाध्य किया जाता है और इसलिए यह सभी अधिसूचना सामान – blindmeis

+0

इस का एक विषय हो रहा है है बहुत बहस, लेकिन यदि आप [इस सवाल] के दूसरे जवाब को देखते हैं (http: // stackoverflow।कॉम/प्रश्न/11154381/डेटाग्रिड-बाध्य-से-डेटाटेबल-रीफ्रेशिंग-वैल्यू), और विशेष रूप से टिप्पणियों को समझाया गया है। IBindingListView इंटरफ़ेस INotifyPropertyChanged की आवश्यकता को प्रतिस्थापित नहीं करता है। –

+0

आप एमवीपी द्वारा [इस प्रेजेंटेशन] (http://es.slideshare.net/EyalV/data- बाइंडिंग-in-depth-presentation) को भी देख सकते हैं, 24 की नींद आती है, यह बताती है कि IBindingListView संग्रह में आइटम अवश्य होना चाहिए INotifyPropertyChanged लागू करें। –

4

यह काम करता है, हो सकता है आप कुछ और अधिक जानकारी दे सकते हैं

viewmodel:

public DataTable MyDataTable { get; private set; } 

//ctor 
_ds = new DataSet("Test"); 
this.MyDataTable = _ds.Tables.Add("DT"); 
this.MyDataTable.Columns.Add("First"); 
this.MyDataTable.Columns.Add("Second"); 

this.MyDataTable.Rows.Add("11", "12"); 
this.MyDataTable.Rows.Add("21", "22"); 

//view is updated with this 
public void UpdateTable() 
{ 
    this.MyDataTable.Rows[0][1] = "haha"; 
} 

XAML

<DataGrid AutoGenerateColumns="True" ItemsSource="{Binding MyDataTable}"/> 
4

मैं बहुत यकीन है कि अगर इस समाधान काम करेंगे नहीं कर रहा हूँ लेकिन यह एक के लायक है प्रयत्न।

को DataTable पर बाध्य करने के बजाय, इसे DataView पर बाध्य करने का प्रयास करें। आप

DataTable dt = new DataTable(); 
DataView dv = dt.DefaultView; 

तरह DefaultView संपत्ति का उपयोग कर अपने DataTable एक DataView में बदल सकते हैं डेटा में परिवर्तन करने के DataView अपनी अधिसूचना के साथ बंधन दोनों तरीकों से काम करना चाहिए पर।

+0

आप डेटा Grid1.ItemSource = dt.DefaultView के रूप में सही हैं; –