WPF

2010-07-16 18 views
10

में उपयोगकर्ता नियंत्रण के लिए डेटा बाध्यकारी मेरे पास एक UserControl है जिसे मैं डेटा बाइंडिंग में भाग लेना चाहता हूं। मैंने उपयोगकर्ता नियंत्रण में निर्भरता गुण स्थापित किए हैं, लेकिन यह काम नहीं कर सकता है।WPF

जब मैं स्थिर पाठ (जैसे ब्लूटेक्स्ट = "एबीसी") के साथ कॉल करता हूं तो uc सही टेक्स्ट प्रदर्शित करता है। जब मैं इसे स्थानीय सार्वजनिक संपत्ति से बांधने की कोशिश करता हूं, तो यह हमेशा खाली होता है।

<src:BlueTextBox BlueText="Feeling blue" />   <!--OK--> 
<src:BlueTextBox BlueText="{Binding Path=MyString}" /> <!--UserControl always BLANK!--> 
<TextBox Text="{Binding Path=MyString}" Width="100"/> <!--Simple TextBox Binds OK--> 

मैंने कोड को निम्नलिखित सरलीकृत उदाहरण में उबाला है।

<UserControl x:Class="Binding2.BlueTextBox" ... 
    <Grid> 
     <TextBox x:Name="myTextBox" Text="{Binding BlueText}" Foreground="Blue" Width="100" Height="26" /> 
    </Grid> 

यहाँ UserControl के पीछे कोड है:: यहाँ UserControl के XAML है

public partial class BlueTextBox : UserControl 
{ 
    public BlueTextBox() 
    { 
     InitializeComponent(); 
     DataContext = this; // shouldn't do this - see solution 
    } 

    public static readonly DependencyProperty BlueTextProperty = 
     DependencyProperty.Register("BlueText", typeof(string), typeof(BlueTextBox)); 

    public string BlueText 
    { 
     get { return GetValue(BlueTextProperty).ToString(); } 
     set { SetValue(BlueTextProperty, value.ToString()); } 
    } 

इस तरह यह वास्तव में आसान होना चाहिए लगता है, लेकिन मैं यह काम नहीं कर सकता। आपकी सहायताके लिए धन्यवाद!

अधिक जानकारी: जब मैं यूजीन द्वारा सुझाए गए फ़िक्स का प्रयास कर रहा था, तो मैंने कुछ असाधारण व्यवहार देखा। मैंने मेटाडेटा में एक PropertyChangedCallback जोड़ा; यह मुझे ब्लूटेक्स्ट सेट सेट के मूल्य को देखने की अनुमति देता है। स्ट्रिंग को एक स्थिर मान (= "नीली लग रही") पर सेट करते समय PropertyChanged ईवेंट आग लगती है। डेटा बाइंडिंग केस प्रॉपर्टी चेंज नहीं करता है। मुझे लगता है कि इसका मतलब है कि डेटा-बाउंड मान UserControl पर नहीं भेजा जा रहा है। (मुझे लगता है कि कन्स्ट्रक्टर स्थिर मामले में नहीं बुलाया जाता है)

समाधान: समस्याओं को आर्कटुरस और जेपीएसस्टवायर द्वारा सही ढंग से पहचाना गया था। सबसे पहले, जब मैं डेटा कॉन्टेक्स्ट = नियंत्रण के निर्माता में सेट करता हूं तो डेटा बाध्यकारी ओवरराइट कर रहा था। इसने डेटा बाध्य मान को सेट होने से रोका। मुझे नियंत्रण x: नाम = रूट का नाम भी देना था, और बाध्यकारी ElementName = रूट int XAML निर्दिष्ट करें। टूवे बाध्यकारी प्राप्त करने के लिए, मुझे कॉलर में मोड = दोवे सेट करने की आवश्यकता थी।

<src:BlueTextBox BlueText="{Binding Path=MyString, Mode=TwoWay}}" /> <!--OK--> 

अब UserControl में XAML:

<UserControl x:Class="Binding2.BlueTextBox" x:Name="root"... 
    <Grid> 
     <TextBox x:Name="myTextBox" Text="{Binding ElementName=root, Path=BlueText}" Foreground="Blue" Width="100" Height="26" /> 
    </Grid> 

अंत में मैं UserControl के निर्माता में DataContext = इस हटाया यहाँ सही कोड है।

public BlueTextBox() 
    { 
     InitializeComponent(); 
     //DataContext = this; -- don't do this 
    } 

सभी को जबरदस्त मदद के लिए धन्यवाद!

उत्तर

11

आप इस प्रकार DataContext अधिलेखित जब अन्य नियंत्रण में इस नियंत्रण का उपयोग कर अपने आप को नियंत्रण में DataContext निर्धारित करते हैं,। अपने अपनी स्थिति में उदाहरण के रूप में बाध्यकारी ले रहा है:

<src:BlueTextBox BlueText="{Binding Path=MyString}" /> 

एक बार भरी हुई है और सभी DataContext सेट कर दिया जाता है, यह कारण आप इसे करने के DataContext की स्थापना करने के लिए अपने BlueTextBox बात नियंत्रण में पथ MyString के लिए दिखेगा। मुझे लगता है कि यह नहीं है कि आप इसे कैसे काम करने का इरादा रखते हैं;)।

समाधान:

बदलें पाठ बंधन 2 बाइंडिंग में से एक या तो:

{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type src:BlueTextBox}}, Path=BlueText} 

या

नाम अपने नियंत्रण रूट (या कुछ है कि तरह)

<UserControl x:Name="Root" 

{Binding ElementName=Root, Path=BlueText} 

और

हटाएं
DataContext = this; 
अपने UserControl के निर्माता से

और यह एक आकर्षण की तरह काम करना चाहिए ..

0

संभवतः आपको अपनी संपत्ति फ्रेमवर्कप्रॉपर्टी मेटाडाटा में जोड़ने की आवश्यकता है जहां फ्रेमवर्कप्रॉपर्टी मेटाडेटाऑप्शन। एफ़क्ट्स रेन्डर और प्रभाव मापन निर्दिष्ट करें।

FrameworkPropertyMetadataOptions enumeration MSDN article

+0

दोनों AffectsRender और AffectsMeasure स्थापित करने की कोशिश की दर्ज की दौरान UIPropertyMetadata पर PropertyChangedCallback उल्लेख है, लेकिन इस कोई असर नहीं था। धन्यवाद। – RaoulRubin

2

मैं इस मामले तुम बंधन में ElementName संपत्ति निर्धारित करने की आवश्यकता में सोचते हैं। कुछ इस तरह:

<UserControl x:Class="Binding2.BlueTextBox" x:Name="blueTextBox"... 
<Grid> 
    <TextBox x:Name="myTextBox" Text="{Binding ElementName=blueTextBox, Path=BlueText}" Foreground="Blue" Width="100" Height="26" /> 
</Grid> 
0

मैं जानता हूँ कि यह एक पुराने विषय है लेकिन अभी भी है।

इसके अलावा अपने डीपी

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

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