2008-11-25 17 views
6

मुझे अभी एहसास हुआ है कि मैं बाध्यकारी/निर्भरता गुणों को मजबूत कर रहा हूं और वास्तव में अवधारणा को मूल रूप से समझ नहीं रहा हूं।डब्ल्यूपीएफ निर्भरता प्रॉपर्टीज

यहाँ निर्भरता संपत्ति:

public string Problem 
{ 
    get { return (string)GetValue(ProblemProperty); } 
    set { SetValue(ProblemProperty, value); } 
} 

public static readonly DependencyProperty ProblemProperty = 
    DependencyProperty.Register(
    "Problem", 
    typeof(string), 
    typeof(TextBox)); 

XAML के रूप में तो यह है:

<TextBlock Text="{Binding Path=Problem}"/> 

मैं मैन्युअल रूप से वस्तु के निर्माता में एक मूल्य के लिए Problem संपत्ति सेट कर रहा हूं लेकिन यह 'नहीं करता है तदनुसार TextBlock अपडेट करें। । । कोई विचार? मैंने Mode="OneWay" और Mode="TwoWay" बाध्यकारी पर कोशिश की है और यह अभी भी काम नहीं करता है।

मैंने सोचा कि यह स्वचालित रूप से काम करना चाहिए था? या मैं मूल रूप से कुछ गलत हो रहा हूँ?

धन्यवाद

+0

सबकुछ ठीक दिखता है। यह आपके 'DataContext' होना चाहिए। आप इसे कैसे सेट कर रहे हैं? –

उत्तर

11

आपकी समस्या निश्चित रूप से आपके डेटाकॉन्टेक्स्ट से संबंधित है। {बाध्यकारी} एक्सटेंशन को यह जानने की आवश्यकता है कि संपत्ति कहां रहती है, जिसके लिए आप बाध्यकारी हैं। डिफ़ॉल्ट स्थान जो यह देखता है वह तत्व डेटाकॉन्टेक्स्ट है जो डिफ़ॉल्ट रूप से हमेशा इसके मूल तत्व के डेटाकॉन्टेक्स्ट पर सेट होता है। यदि आप डेटाकॉन्टेक्स्ट को लॉजिकल ट्री को पैरेंट विंडो पर ले जाते हैं, तो डेटाकॉन्टेक्स्ट शून्य होगा (क्योंकि आपकी विंडो का डेटाकॉन्टेक्स्ट शून्य है)। इसलिए आपके {बाइंडिंग} अपने TextBlock पर "कह रहा है मेरी DataContext की समस्या roperty ... जो रिक्त है करने के लिए अपने पाठ संपत्ति में आबद्ध करें।

इस हल करने के तरीकों की एक जोड़ी रहे हैं। एक जैसे करने के लिए किया जाएगा Jobi उल्लेख किया है और आप का तत्व गुण सेट खिड़की जहां DependencyProperty इस तरह परिभाषित किया गया है को इंगित करने के लिए बाध्य:।

<TextBlock Text="{Binding Path=Problem,ElementName=_window}" /> 

एक अन्य विकल्प ही भेजने के लिए अपना खिड़की के DataContext स्थापित करने के लिए किया जाएगा इस तरह सभी इसकी सामग्री में निहित तत्वों में सभी के पास विंडो का डेटाकॉन्टेक्स्ट होगा।

<Window .... 
     DataContext="{Binding RelativeSource={RelativeSource Self}}"> 

अब किसी भी समय आप (आपके समस्या निर्भरता संपत्ति की तरह) विंडो में परिभाषित गुण के लिए बाध्य करने की जरूरत है, तो आप सिर्फ यह कर सकते हैं:

<TextBlock Text="{Binding Problem}" /> 
+0

विंडो के डेटाकॉन्टेक्स्ट को सेट करने का समाधान यह मेरे लिए काम नहीं करता है। यह केवल तभी काम करता है जब मैं एक तत्व के डेटाैकेंटेक्स्ट को एक स्तर नीचे या अधिक (पहला ग्रिड काम) विंडो में सेट करता हूं। क्या यह उम्मीद है? – Erik83

0

यह एक खिड़की इस में सेट है

public partial class Window1 : Window 
{ 
    public string Problem 
    { 
     get { return (string)GetValue(ProblemProperty); } 
     set { SetValue(ProblemProperty, value); } 
    } 

    public static readonly DependencyProperty ProblemProperty = 
        DependencyProperty.Register(
        "Problem", 
        typeof(string), 
        typeof(Window1)); 


    public Window1() 
    { 
     InitializeComponent(); 

     Problem = "ifowiof"; 
    } 

    public void OnClick(object sender, EventArgs e) 
    { 
     Problem = "behl"; 
    } 

    public void OnCancel(object sender, EventArgs e) 
    { 
     Problem = "eioeopje"; 
    } 
} 

XAML:

<Window x:Class="WpfToolTip.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
     <StackPanel> 
      <Button Click="OnClick" Content="OK" /> 
      <Button Click="OnCancel" Content="Cancel" /> 
      <TextBlock Text="{Binding Path=Problem}" /> 
    </StackPanel> 
</Window> 

यह काम करता है अगर मैं RelativeSource सेट करता हूं जैसे आपने लोड किया था, लेकिन अगर मैं कोड में मैन्युअल रूप से Problem संपत्ति को बदलता हूं (यानी। एक बटन क्लिक के माध्यम से) यह नए मूल्य के साथ TextBlock अद्यतन नहीं करता है।

+0

क्या आपको कभी इसका जवाब मिला? मुझे एक ही समस्या है। ऐसा लगता है कि जब आप समस्या संपत्ति सेट करते हैं तो बाध्यकारी खो जाता है। मुझे यकीन नहीं है कि इस तरह के मूल्य को अद्यतन करने के लिए सही प्रक्रिया क्या है। –

2

आप एलिमेंटनाम बाइंडिंग का उपयोग यहां कर सकते हैं, तत्व विंडो ही होगा।

<Window x:Class="WpfToolTip.Window1" 
x:Name="_window" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel> 
     <Button Click="OnClick" Content="OK" /> 
     <Button Click="OnCancel" Content="Cancel" /> 
     <TextBlock Text="{Binding Path=Problem,ElementName=_window}" /> 
</StackPanel> 

0

अपने कोड आप वर्ग पाठ बॉक्स (उद्धरण की अंतिम पंक्ति) के लिए निर्भरता संपत्ति रजिस्टर में।

सार्वजनिक स्थिर केवल पढ़ने के लिए DependencyProperty ProblemProperty =
DependencyProperty.Register (
"समस्या",
typeof (स्ट्रिंग),
typeof (पाठ बॉक्स));

तो तुम केवल बक्सें के लिए ProblemProperty के लिए एक मूल्य निर्धारित कर सकते हैं, लेकिन मैं कोड के टुकड़े में से किसी में किसी भी पाठ बॉक्स नहीं मिल रहा। आपको अपनी निर्भरता संपत्ति को उस प्रकार के लिए पंजीकृत करना चाहिए, जिस पर मूल्य आवंटित किया जाएगा, आपके नमूने से सही विकल्प मेरे लिए स्पष्ट नहीं है। आप, जैसा कि मीका करता है, इसे विंडो के डीपी के रूप में परिभाषित कर सकता है, फिर अपनी तत्काल विंडो पर संपत्ति सेट कर सकता है। या आप यह विंडो के अंदर किसी भी नामित निर्भरता वस्तु, यानी साथ नाम = m_ContentElement किसी वस्तु के लिए निर्धारित कर सकते हैं, और फिर अपने
{Binding ElementName=m_ContentElement, Path=Problem}
या कम के लिए बाध्य सेट:
{Binding Problem, ElementName=m_ContentElement}

0

वहाँ कारण को समझने के लिए दो तरीके हैं आपके द्वारा वर्णित समस्या का।

पहले - आपको संपत्ति को हैंडलर (निर्भरता संपत्ति घोषणा में) सेट करने और ब्रेकपॉइंट को सेट करने की कोशिश करनी चाहिए। आप देखेंगे कि आपकी संपत्ति बदल रही है या नहीं।

दूसरे पर - आपको निर्भरता संपत्ति मालिक के प्रकार की जांच करनी चाहिए।

क्या आप पूर्ण xaml और codebehind दिखा सकते हैं?

2

typeof(string) के बजाय typeof(object) आज़माएं।

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