2012-05-06 31 views
7

我发现实际上,我在互联网上找到的关于绑定的每个示例都有一个继承INotifyPropertyChanged接口的类(它绑定到另一个属性),并在类属性的set部分中使用方法。为什么在WPF中使用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 SS:

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如果你只打算使用结合的财产(如你已经发现了),但你需要它,这样你可以告诉其他人写信给该属性并相应地更新显示的值。

要查看我在说什么,请在窗口中添加一个按钮,直接点击时会更改绑定属性的值(而不是绑定到该属性的UI元素的相应属性)。使用INotifyPropertyChanged时,当您单击按钮时,您将看到UI将自身更新为新值;没有它,用户界面仍然会显示“旧”值。

+0

我明白了。非常感谢你的回答。它真的帮助了我。我会在5分钟内将它标记为正确的答案。我需要那5分钟,因为stackoverflow不让我把问题标记为答案 – morcillo

+0

@morcillo:很高兴帮助。干杯! – Jon

+0

好吧,我不能将它标记为已回答,因为我这样做了,它不起作用。我取消注释(我不知道这个词是否正确..英语不是我的第一语言)Inotify部分,它应该已经工作,但它没有。如果你愿意,我可以把你做的事情发给你。这很简单。一个显示绑定值的文本框,一个改变它的按钮和一个显示在消息框中的按钮。消息框正在工作,但文本框没有更新 – morcillo

0

从这里的讨论中,我想你错过实现

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

一旦实现,你可以看到UI被自动更新。 您可以在MSDN上查看详细信息或简要版my blog here.

相关问题