2013-02-05 24 views
6

लिए बाइंडिंग मैं किए गए कस्टम SongDescription बुलाया UserControl:WPF UserControl कस्टम DependencyProperty

<UserControl x:Class="DPTestAp.SongDescription" ...> 
    <Grid x:Name="LayoutRoot"> 
     <DockPanel Height="50"> 
      <TextBlock x:Name="title" Text="{Binding name}" Width="100" Height="30"/> 
      <TextBox x:Name="lyrics"/> 
     </DockPanel> 
    </Grid> 
</UserControl> 

मैं DependencyProperty इसे करने के लिए कहा:

public partial class SongDescription : UserControl 
{ 
    public static readonly DependencyProperty SongProperty = DependencyProperty.Register("Song", typeof(Song), typeof(SongDescription)); 

    public Song Song 
    { 
     get 
     { 
      return (Song)GetValue(SongProperty); 
     } 
     set 
     { 
      SetValue(SongProperty, value); 
      updateLyrics() 
     } 
    } 

    private void updateLyrics() 
    { 
     lyrics.Text = Song.lyrics; 
    } 

    public SongDescription() 
    { 
     InitializeComponent(); 
    } 
} 

सवाल यह है: यह कैसे SongProperty के लिए कुछ बाध्य करने के लिए? मैं इस तरह मेरी मुख्य विंडो में SongDescription का उपयोग करें:

<local:SongDescription x:Name="songDescription" Song="{Binding DataContext}"/> 

मैं अपने पाठ बॉक्स गीत शो बोल नहीं कर सकता। मुख्य विंडो में मैं, songDescription को DataContext स्थापित करने के लिए इस तरह की कोशिश की:

songDescription.DataContext = new Song() { name="Home", lyrics="Hold on, to me as we go" }; 

या खिड़की खुद को इस तरह:

DataContext = new Song() { name="Home", lyrics="Hold on, to me as we go" }; 

मैं भी गाने के लिए एक संसाधन बनाने के लिए और SongProperty करने के लिए इसे इस तरह बाध्य करने की कोशिश की :

<Window.Resources> 
    <local:Song x:Key="res" name="Home" lyrics="Hold on, to me as we go"/> 
</Window.Resources> 
<Grid> 
    <local:SongDescription x:Name="songDescription" Song="{StaticResource res}"/> 
</Grid> 

कुछ भी मदद नहीं की। टेक्स्टब्लॉक शीर्षक गीत का नाम ठीक है। लेकिन मैं अद्यतन नहीं कर सकता गीत() विधि कहा जा सकता है। (वास्तविक जीवन में यह विधि अधिक जटिल है, इसलिए मैं नाम के साथ बाध्यकारी का उपयोग नहीं कर सकता)।

धन्यवाद!

उत्तर

7

यूप, तो यह निर्भरता गुणों के साथ एक गॉचा है। आप कभी भी एक्सेसर विधियों (प्राप्त/सेट) के अंदर सत्यापन कोड डालते हैं क्योंकि निर्भरता गुण WPF द्वारा उस तालिका में संग्रहीत किए जाते हैं, जो स्वयं ही प्रबंधित होता है। यही कारण है कि आपको निर्भरता गुणों को पंजीकृत करना होगा, यह अनिवार्य रूप से प्रत्येक प्रॉपर्टी से जुड़े मूल्यों को संग्रहीत करने के लिए इस तालिका पर प्रविष्टियां बनाता है, और जब आप 'GetValue'/'SetValue' का उपयोग करते हैं तो आप इस तालिका में प्रविष्टियों को अपडेट कर रहे हैं (जिस तरह से यह बताता है कि कैसे WPF सामान्य रूप से डेटा बाइंडिंग प्रबंधित करने में सक्षम है)।

हालांकि इसका अपवाद यह है कि डब्ल्यूपीएफ आपकी संपत्ति एक्सेसर्स को पूरी तरह से बाईपास कर सकता है क्योंकि यह वास्तविक डेटा तक सीधे पहुंच है। यह आपके एक्सेसर्स का उपयोग क्यों करना चाहिए यदि यह सीधे डेटा पर जा सके। इसके बजाय आपको 'PropertyChanged' कॉलबैक फ़ंक्शन या सत्यापन करने की कुछ WPF स्वीकृत विधि को लागू करने की आवश्यकता है, लेकिन कभी भी आपके एक्सेसर्स में ऐसा नहीं करता है।

देखें:

http://msdn.microsoft.com/en-us/library/ms752914.aspx

+0

धन्यवाद, मास्टर! –

+0

लेकिन फिर, 'PropertyChanged' कॉलबैक है, मैं किसी भी नियंत्रण को अपडेट करने में सक्षम नहीं हूं, क्योंकि यह एक साझा फ़ंक्शन है! –

2

sircodesalot के जवाब के अलावा, आप अपने गीत पाठ बॉक्स पर बाध्य नहीं कर रहे हैं। साथ ही, चूंकि आपका गीत एक वर्ग है, इसलिए आपको "पथ = गीत। गीत" जैसे बक्से में दिखने वाले गुणों के लिए पथों को पूरी तरह निर्दिष्ट करना होगा।

विचार करने की एक और बात यह है कि निर्भरता गुणों के साथ; आपका मोड डिफॉल्ट रूप से चालू हो जाएगा, इसलिए पाठ फ़ील्ड संपादन योग्य बनाना वास्तव में तब तक म्यूट होगा जब तक कि आप इसे बदल नहीं देते।

तीसरा, यदि आप एमवीवीएम का उपयोग कर रहे हैं तो आपको केवल दृश्य मॉडल पर सेट करने के लिए अपने मुख्य विंडो संदर्भ की आवश्यकता है और इसके साथ मिलान करने के लिए एक मिलान करने वाली गीत संपत्ति है।

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