2009-05-27 24 views
9

मेरे पास एक ऐसा संवाद है जो मुख्य स्क्रीन पर पॉप अप करता है (यह वास्तव में एक उपयोगकर्ता नियंत्रण है जो कि बिली होलीस से एप्लिकेशन डेमो के अनुसार पृष्ठ पर दिखाई देता है) जिसमें मेरे स्क्रीन में मुख्य स्क्रीन से डेटा संपादित किया जा सकता है। मुख्य स्क्रीन केवल पढ़ा जाता है।मैं बाध्यकारी गुणों को अपडेट करने से कैसे रोकूं?

मेरी समस्या यह है कि जब मैं संवाद में डेटा बदलता हूं, तो मुख्य स्क्रीन अपडेट पर भी डेटा अपडेट होता है। स्पष्ट रूप से वे एक ही वस्तु से बंधे हैं, लेकिन बाध्यकारी अद्यतन को रोकने का कोई तरीका है जब तक कि मैं अपने संवाद में सहेजता हूं?

उत्तर

10

आप इस्तेमाल कर सकते हैं एक :

... 
<StackPanel Name="panel"> 
    <StackPanel.BindingGroup> 
     <BindingGroup Name="bindingGroup"/> 
    </StackPanel.BindingGroup> 
    <TextBox Text="{Binding Foo}"/> 
    <TextBox Text="{Binding Bar}"/> 
    <Button Name="btnSubmit" Content="Submit" OnClick="btnSubmit_Click"/> 
    <Button Name="btnCancel" Content="Cancel" OnClick="btnCancel_Click"/> 
</StackPanel> 
... 

पीछे कोड:

private void UserControl_Loaded(object sender, RoutedEventArgs e) 
{ 
    panel.BindingGroup.BeginEdit(); 
} 

private void btnSubmit_Click(object sender, RoutedEventArgs e) 
{ 
    panel.BindingGroup.CommitEdit(); 
    panel.BindingGroup.BeginEdit(); 
} 

private void btnCancel_Click(object sender, RoutedEventArgs e) 
{ 
    panel.BindingGroup.CancelEdit(); 
    panel.BindingGroup.BeginEdit(); 
} 
+0

शानदार विचार! अगर मैंने प्रत्येक बाध्यकारी कथन में समूह घोषित किया तो मुझे केवल यह काम मिल गया। हालांकि, यह अन्य विकल्पों की तुलना में बहुत आसान है। – Telavian

0

वे एक ही रास्ता मैं इसे किया देखा है है कैसे जोश स्मिथ कन्वर्टर्स साथ here का उल्लेख है। यद्यपि सबसे आसान तरीका नहीं है।

3

Binding.UpdateSourceTrigger संपत्ति पर एक नज़र डालें।

तुम इतनी

<TextBox Name="myTextBox" 
    Text={Binding Path=MyProperty, UpdateSourceTrigger=Explicit} /> 

की तरह अपने संवाद में Binding सेट और फिर घटना अपने बटन में UpdateSource विधि कॉल बचाने

myTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource(); 

एक बार जब आप UpdateSource बुलाया गया है स्रोत वस्तु हो जाएगा कर सकते हैं TextBox

+0

मैंने कोशिश की लेकिन यह काम नहीं करता है। यह अभी भी मुख्य स्क्रीन पर टेक्स्टब्लॉक अपडेट करता है। स्पष्ट विकल्प यह बताता है कि यह केवल तब अपडेट होगा जब अपडेटसोर्स विधि कहा जाता है, लेकिन इस मामले में नहीं। –

+0

वास्तव में? मैं आश्चर्यचकित हूँ। मैंने अभी कोशिश की और यह मेरे लिए काम करता है। शायद आपके आवेदन में कुछ और है जो समस्याएं पैदा कर रहा है? – Ray

+0

यह निश्चित रूप से काम करता है लेकिन आपको प्रत्येक पर UpdateSource() को कॉल करने के लिए सभी बाइंडिंग के माध्यम से पुन: प्रयास करना चाहिए। ऐसा करने का सबसे आसान तरीका बाइंडिंग को एक बाध्यकारी समूह में जोड़ना है। बोनस के रूप में आपको अपडेट्ससोर्स ट्रिगर को संबंधित बाइंडिंग पर स्पष्ट रूप से स्पष्ट करने के लिए सेट किया जाता है। – Lu55

0

से मान के साथ अपडेट किया गया है, मैं BindingGroup का उपयोग करना भी चुनता हूं। लेकिन BeginEdit()/CommitEdit()/CancelEdit() पैटर्न के बजाय मैं UpdateSource() को बाइंडिंग समूह से जुड़े सभी बाइंडिंग पर स्पष्ट रूप से कॉल करता हूं। यह दृष्टिकोण मुझे केवल एक ही घटना के बजाय हैंडलर 3.

private void OkButton_Click(object sender, RoutedEventArgs e) 
{ 
    CommitChanges(); 
    DialogResult = true; 
    Close(); 
} 

private void CommitChanges() 
{ 
    foreach (var bindingExpression in this.BindingGroup.BindingExpressions) 
    { 
     bindingExpression.UpdateSource(); 
    } 
} 
0

लेख Edit With Explicit UpdateSourceTrigger जोड़ने के लिए आप कैसे को बचाने को लागू करने और UpdateSourceTrigger=Explicit साथ रद्द करने के बारे में अधिक जानकारी दे देंगे अनुमति देता है।

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