में उपयोगकर्ता नियंत्रण के लिए डेटा बाध्यकारी मेरे पास एक 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
}
सभी को जबरदस्त मदद के लिए धन्यवाद!
दोनों AffectsRender और AffectsMeasure स्थापित करने की कोशिश की दर्ज की दौरान UIPropertyMetadata पर PropertyChangedCallback उल्लेख है, लेकिन इस कोई असर नहीं था। धन्यवाद। – RaoulRubin