2012-05-06 10 views
7

मैंने यह माना है कि बाइंडिंग के बारे में इंटरनेट पर मिलने वाले हर उदाहरण में एक वर्ग है (जो किसी अन्य संपत्ति से जुड़ा हुआ है) जो INotifyPropertyChanged इंटरफ़ेस को प्राप्त करता है और वर्ग की संपत्ति के सेट हिस्से में एक विधि का उपयोग करता है।क्यों डब्ल्यूपीएफ में बाइंडिंग के साथ INOTifyPropertyChanged का उपयोग करें?

मैंने बाध्यकारी उदाहरण से उस भाग को हटाने का प्रयास किया है और यह विधि के साथ ही काम करता है।

यहां उदाहरण है। मैंने इसे बदल दिया है, इसलिए यह एक दोवे बाध्यकारी मोड होगा और एक संदेश बॉक्स में बदली गई संपत्ति दिखाएगा।

मुझे लगता है कि सिर्फ बाइंडिंग के साथ एक छोटा सा चारों ओर खेलने के लिए है, लेकिन अब मैं वास्तव में क्यों है कि इंटरफ़ेस प्रयोग किया जाता है पता नहीं है किया

संपादित

XAML:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="30"/> 
      <RowDefinition Height="30"/> 
      <RowDefinition Height="30"/> 
      <RowDefinition Height="30"/> 
      <RowDefinition Height="30"/> 
      <RowDefinition Height="40"/> 
      <RowDefinition Height="30"/> 
      <RowDefinition Height="30"/> 
      <RowDefinition Height="30"/> 
      <RowDefinition Height="30"/> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="30"/> 
      <ColumnDefinition Width="30"/> 
      <ColumnDefinition Width="30"/> 
      <ColumnDefinition Width="30"/> 
      <ColumnDefinition Width="30"/> 
      <ColumnDefinition Width="100"/> 
      <ColumnDefinition Width="30"/> 
      <ColumnDefinition Width="30"/> 
      <ColumnDefinition Width="30"/> 
      <ColumnDefinition Width="30"/> 
      <ColumnDefinition Width="30"/> 
      <ColumnDefinition Width="30"/> 
      <ColumnDefinition Width="30"/> 
      <ColumnDefinition Width="30"/> 
      <ColumnDefinition Width="30"/> 
      <ColumnDefinition Width="30"/> 
     </Grid.ColumnDefinitions> 
     <Button Grid.Row="5" Grid.Column="5" Name="btnBinding" Click="btnBinding_Click" Width="100" Height="30"> 
      <Grid HorizontalAlignment="Left" VerticalAlignment="Center"> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="25"/> 
       </Grid.RowDefinitions> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="50"/> 
        <ColumnDefinition Width="50"/> 
       </Grid.ColumnDefinitions> 
       <TextBox Name="txtBinding" Width="30" Height="25" HorizontalAlignment="Left"/> 
       <Label Grid.Column="1" Content="Bind"/> 
      </Grid> 
     </Button> 
     <Button Grid.Column="5" Grid.Row="6" Name="btnMessage" Click="btnMessage_Click" Content="MessageBox"/> 
     <Button Grid.Column="5" Grid.Row="4" Name="btnChangeproperty" Click="btnChangeproperty_Click" Content="Change Property"/> 
    </Grid> 
</Window> 

Main.cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     Binding bind; 
     MyData mydata; 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void btnBinding_Click(object sender, RoutedEventArgs e) 
     { 
      mydata = new MyData("T"); 
      bind = new Binding("MyDataProperty") 
      { 
       Source = mydata, 
       Mode = BindingMode.TwoWay 
      }; 

      txtBinding.SetBinding(TextBox.TextProperty, bind); 
     } 

     private void btnMessage_Click(object sender, RoutedEventArgs e) 
     { 
      MessageBox.Show(mydata.MyDataProperty); 
     } 

     private void btnChangeproperty_Click(object sender, RoutedEventArgs e) 
     { 
      mydata.MyDataProperty = "New Binding"; 
     } 
    } 
} 

MyData CLA एस एस:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.ComponentModel; 

namespace WpfApplication1 
{ 
    public class MyData 
    { 
     private string myDataProperty; 

     public MyData() { } 

     public MyData(DateTime dateTime) 
     { 
      myDataProperty = "Last bound time was " + dateTime.ToLongTimeString(); 
     } 

     public MyData(string teste) 
     { 
      myDataProperty = teste; 
     } 

     public String MyDataProperty 
     { 
      get { return myDataProperty; } 
      set 
      { 
       myDataProperty = value; 
       OnPropertyChanged("MyDataProperty"); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     private void OnPropertyChanged(string info) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(info)); 
      } 
     } 
    } 
} 

उत्तर

17

आप INotifyPropertyChanged की जरूरत नहीं है अगर आप केवल संपत्ति के लिए लिखने के लिए बाध्य उपयोग करने के लिए (के रूप में आप बाहर पाया है) का इरादा रखते हैं, लेकिन आप इसे की आवश्यकता है ताकि आप उस बता सकते हैं किसी और को ने संपत्ति को लिखा और तदनुसार प्रदर्शित मूल्य को अपडेट किया।

देखने के लिए 'मैं क्या बारे में बात कर हूँ, अपने विंडो में कोई बटन जोड़ने जो क्लिक सीधे बाध्य संपत्ति (नहीं यूआई तत्व है कि संपत्ति के लिए बाध्य की इसी विशेषता) का मान बदल जाता है। INotifyPropertyChanged के साथ, आप यूआई को बटन पर क्लिक करते समय नए मान पर अपडेट कर देखेंगे; इसके बिना, यूआई अभी भी "पुराना" मान दिखाएगा।

+0

पर एक संक्षिप्त संस्करण पर विवरण देख सकते हैं। उस उत्तर के लिए बहुत बहुत धन्यवाद। यह वास्तव में मेरी मदद की। मैं इसे 5 मिनट में सही उत्तर के रूप में चिह्नित करूंगा। मुझे उन 5 मिनट की जरूरत है क्योंकि स्टैक ओवरफ्लो मुझे प्रश्न को चिह्नित करने की अनुमति नहीं दे रहा है क्योंकि – morcillo

+0

@ मॉर्सीलो: मदद करने में खुशी हुई। चीयर्स! – Jon

+0

ठीक है, मैं इसे उत्तर के रूप में चिह्नित नहीं कर सकता क्योंकि मैंने ऐसा किया और यह काम नहीं किया। मैं असम्बद्ध हूं (मुझे नहीं पता कि यह शब्द सही है या नहीं .. अंग्रेजी मेरी पहली भाषा नहीं है) इनोटिफी भाग और इसे काम करना चाहिए था लेकिन ऐसा नहीं हुआ। यदि आप चाहते हैं कि मैं आपको वह काम भेजूं जो मैंने किया था। यह वास्तव में सरल है। एक टेक्स्टबॉक्स जो बाध्यकारी के मान को प्रदर्शित करता है, एक बटन जो इसे बदलता है और एक बटन जो इसे संदेशबॉक्स में दिखाता है। संदेशबॉक्स फिन काम कर रहा है, लेकिन टेक्स्टबॉक्स – morcillo

0

चर्चाओं यहाँ से, मैं तुम्हें

RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(“Propety Name”)) 

को लागू करने के बाद कि कार्यान्वित किया जाता है जैसा कि आप देख सकते हैं कि यूआई स्वचालित रूप से अद्यतन किया जाता है याद किया लगता है। आप एमएसडीएन या my blog here.