2010-02-23 16 views
21

मैं बिना किसी सफलता के क्लास इंस्टेंस की स्ट्रिंग प्रॉपर्टी से जुड़ने के लिए लेबल की सामग्री प्राप्त करने का प्रयास कर रहा हूं।डब्ल्यूपीएफ: एक वर्ग संपत्ति को लेबल को बाध्य करना

XAML:

<Window x:Class="WPFBindingTest.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300">  
<Grid>   
    <Label Height="28" Margin="12,55,106,0" Name="label1" Background="Bisque" 
      Content="{Binding Source=MyFoo, Path=W1}" VerticalAlignment="Top" /> 

    <Label Height="28" Margin="12,12,106,0" Name="label2" Background="Bisque" 
      Content="{Binding Source=MyFoo, Path=W2}" VerticalAlignment="Top" /> 

    <Button Height="23" HorizontalAlignment="Right" Margin="0,0,32,48" 
      Name="button1" VerticalAlignment="Bottom" Width="89" 
      Click="button1_Click"> 
     Set Properties 
    </Button> 

</Grid> 
</Window> 

सी #:

namespace WPFBindingTest 
{ 
    public partial class Window1 : Window 
    { 
     public Foo MyFoo; 

     public Window1() 
     { 
      InitializeComponent();    

      MyFoo = new Foo();   
     } 

     private void button1_Click(object sender, RoutedEventArgs e) 
     {  
      MyFoo.W1 = "Hello"; 
      MyFoo.W2 = "Dave"; 
     } 
    } 

    public class Foo 
    { 
     public string W1 { get; set; } 
     public string W2 { get; set; } 
    } 
} 

यानी जब मैं बटन पर क्लिक करें, मैं MyFoo को "नमस्ते" और "डेव" के गुण सेट है, और उस में परिलक्षित चाहते यूआई पर लेबल। मैंने सामग्री को बाध्यकारी के रूप में सेट किया है लेकिन कुछ सही नहीं है। मुझसे यहां क्या गलत हो रहा है?

उत्तर

18

आप अपने Window1 उदाहरण के लिए अपने MyFoo निर्भरता संपत्ति कर सकते हैं और सेट DataContext:

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

अधिक जानकारी के लिए इस article देखें।

MyFoo बनाना एक निर्भरता संपत्ति अनिवार्य नहीं है। यहDataContext असाइन करने से पहले संपत्ति मूल्य सेट करने से पहले केवल एक प्रॉपर्टी के साथ काम कर सकता है। (लेकिन कभी भी एक फ़ील्ड के साथ नहीं।) हालांकि यदि आप लेबल को W1 और W2 के बदलते मानों को चुनना चाहते हैं (या DataContect असाइन करने से पहले या बाद में मान सेट किए जाने पर आपको पता नहीं है), तो आपको Foo की आवश्यकता है या तो DependencyObject हो, या इंटरफ़ेस INotifyPropertyChanged लागू करें।

+1

धन्यवाद, यह मेरे सही दिशा में इशारा किया। मेड फू IotifyPropertyChanged लागू करें, फिर विंडो 1 का DataContext को बाइंडिंगलिस्ट पर सेट करें, जिसमें MyFoo शामिल है। लेबल सामग्री अब है: {बाइंडिंग पथ = डब्ल्यू 1, अपडेटसोर्स ट्रिगर = प्रॉपर्टी चेंज} और यह एक इलाज करता है! – Gareth

+1

@Vlad 'निर्भरता प्रॉपर्टी' का उपयोग करने और 'INotifyPropertyChanged' को लागू करने के बीच क्या अंतर होगा या यह स्वयं का प्रश्न होना चाहिए? – ywm

+0

@ymw: यह वास्तव में एक बड़ा सवाल है, वास्तव में काफी बड़ा है। संक्षेप में: दोनों ही बंधन के लिए काम करेंगे, लेकिन 'INotifyPropertyChanged', और अधिक हल्के है' DependencyProperty' तथापि स्मृति नहीं ले करता है, तो इस्तेमाल नहीं किया और एनिमेशन, स्टाइल, टेम्पलेट्स के लिए इस्तेमाल किया जा सकता, माता पिता के कंटेनर से निहित करने के लिए प्राप्त की जा (तत्व) और बहुत कुछ। उदाहरण के लिए देखें [यह उत्तर] (http://stackoverflow.com/a/3674530/276994)। – Vlad

6

या अपनी विंडो को कोई नाम दें: NameOfWindow की तरह और बाध्यकारी एक ElementName का उपयोग करें:

Content="{Binding ElementName=NameOfWindow, Path=MyFoo.W1}" 

पूरा नमूना XAML:

<Window x:Class="WPFBindingTest.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300" Name="NameOfWindow">  
<Grid>   
    <Label Height="28" Margin="12,55,106,0" Name="label1" Background="Bisque" Content="{Binding ElementName=NameOfWindow, Path=MyFoo.W1}" VerticalAlignment="Top" /> 
    <Label Height="28" Margin="12,12,106,0" Name="label2" Background="Bisque" Content="{Binding ElementName=NameOfWindow, Path=MyFoo.W2}" VerticalAlignment="Top" /> 
    <Button Height="23" HorizontalAlignment="Right" Margin="0,0,32,48" Name="button1" VerticalAlignment="Bottom" Width="89" Click="button1_Click">Set Properties</Button> 
</Grid> 
+1

यह काम नहीं कर रहा है। – AnjumSKhan

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