2010-12-03 11 views
7

के साथ एक चर को बाध्य करने के लिए कैसे मैं सोच रहा था कि मैं अपने सी # कक्षा के भीतर एक चर के लिए एक टेक्स्ट ब्लॉक को बांधने में सक्षम कैसे होगा।टेक्स्टब्लॉक

मूल रूप से मेरे पास मेरी .cs फ़ाइल में "कार्ट" चर है। उस कार्ट कक्षा के भीतर मेरे पास विभिन्न योगों तक पहुंच है।

निम्नलिखित मैं क्या बाध्यकारी के लिए है, लेकिन यह चर करने के लिए बाध्य करने के लिए प्रतीत नहीं होता ...

<StackPanel 
    Width="Auto" 
    Height="Auto" 
    Grid.ColumnSpan="2" 
    Grid.Row="5" 
    HorizontalAlignment="Right"> 
    <TextBlock 
     Name="Subtotal" 
     FontFamily="Resources/#Charlemagne Std" 
     FontSize="20" 
     Text="{Binding ElementName=cart, Path=SubTotal}"> 
    </TextBlock> 
    <TextBlock 
     Name="Tax" 
     FontFamily="Resources/#Charlemagne Std" 
     FontSize="20" 
     Text="{Binding ElementName=cart, Path=Tax}"> 
    </TextBlock> 
    <TextBlock 
     Name="Total" 
     FontFamily="Resources/#Charlemagne Std" 
     FontSize="20" 
     Text="{Binding ElementName=cart, Path=Total}"> 
    </TextBlock> 
</StackPanel> 

यह ऐसा करने का सही तरीका क्या है? मदद के लिए एक बार फिर से धन्यवाद!

उत्तर

11

हैं:

<TextBlock Name="Subtotal" FontFamily="Resources/#Charlemagne Std" FontSize="20" Text="{Binding Path=SubTotal}"></TextBlock> 

और अपने खिड़की के निर्माता या लोड घटना में, निम्नलिखित कोड लिखने जब आप अपनी कार्ट श्रेणी बदलते हैं, तो आप टेक्स्टबॉक्स को स्वचालित रूप से अपडेट करना चाहते हैं, आपकी कक्षा को लागू करना होगा ement INotifyPropertyChanged इंटरफ़ेस:

class Cart : INotifyPropertyChanged 
{ 
    // property changed event 
    public event PropertyChangedEventHandler PropertyChanged; 

    private int _subTotal; 
    private int _total; 
    private int _tax; 

    private void OnPropertyChanged(String property) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(property)); 
     } 
    } 

    public int SubTotal 
    { 
     get 
     { 
      return _subTotal; 
     } 
     set 
     { 
      _subTotal = value; 
      OnPropertyChanged("SubTotal"); 
     } 
    } 

    public int Total 
    { 
     get 
     { 
      return _total; 
     } 
     set 
     { 
      _total = value; 
      OnPropertyChanged("Total"); 
     } 
    } 

    public int Tax 
    { 
     get 
     { 
      return _tax; 
     } 
     set 
     { 
      _tax = value; 
      OnPropertyChanged("Tax"); 
     } 
    } 

} 
0

आपको अपनी कक्षा के लिए डेटा स्रोत के रूप में सेट करने की आवश्यकता है। this question भी देखें।

7

ElementName बाध्यकारी में अन्य नियंत्रणों के संदर्भ में उपयोग किया जाता है, कोड के पीछे चर नहीं। कोड के पीछे चरों को संदर्भित करने के लिए, आपको उस चर को नियंत्रण की DataContext संपत्ति पर असाइन करने की आवश्यकता है।

कोड की निम्न पंक्ति की प्रत्येक पुनरावृत्ति बदलें: साथ

<TextBlock Name="Subtotal" FontFamily="Resources/#Charlemagne Std" FontSize="20" Text="{Binding ElementName=cart, Path=SubTotal}"></TextBlock> 

:

this.DataContext = cart; 
+0

आईडी पूरी विंडो के बजाय निकटतम सामान्य पूर्वजों पर डेटा कॉन्टेक्स्ट सेट करने की अनुशंसा करता है .... अन्य नियंत्रणों में बाइंडिंग के बारे में क्या? – Machinarius

2

दो समाधान ..

पहले समाधान:

अपने कोड में डेटा स्रोत के रूप में cart रखो पीछे:

DataSource = cart; 

और यह करने के लिए बाध्य निम्नानुसार है:

{Binding Path=PropertyOfCart} 

दूसरा समाधान:

बाइंड एक ElementName के साथ अपने जड़ नियंत्रण बाध्यकारी है, और इस पर नियंत्रण पर एक संपत्ति के माध्यम से गाड़ी मिलती है:

नाम अपने जड़/माता-पिता नियंत्रण जहां गाड़ी एक प्रॉपर्टी है: इस तरह यह करने के लिए

<UserControl .....snip..... x:Name="Root"> 

बाइंड:

{Binding ElementName=Root, Path=Cart.PropertyOfCart} 

कृपया ध्यान दें कि कार्ट आपके उपयोगकर्ता नियंत्रण की संपत्ति होनी चाहिए, न कि फ़ील्ड

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