2013-04-24 19 views
3

我一直玩WPF和2個數據綁定,以便更好地瞭解它,香港專業教育學院注意到,當一個文本框具有2個數據綁定到一個屬性的屬性被調用兩次。我已經通過在調用屬性時將值寫入輸出窗口來驗證這一點。我的代碼如下: -2路在WPF綁定調用屬性兩次

我的XAML

<Page 
    x:Class="_2waybindTest.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="using:_2waybindTest" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d"> 

    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}"> 
     <TextBox HorizontalAlignment="Left" Margin="55,93,0,0" TextWrapping="Wrap" Text="{Binding TestProperty, Mode=TwoWay}" VerticalAlignment="Top" Width="540"/> 
     <Button Content="Button" HorizontalAlignment="Left" Margin="55,31,0,0" VerticalAlignment="Top" Click="Button_Click_1"/> 
     <TextBox HorizontalAlignment="Left" Margin="55,154,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="540"/> 
    </Grid> 
</Page> 

我簡單的ViewModel類測試背後

/// <summary> 
/// An empty page that can be used on its own or navigated to within a Frame. 
/// </summary> 
public sealed partial class MainPage : Page 
{ 
    public MainPage() 
    { 
     this.InitializeComponent(); 
     DataContext = new viewmodel(); 
    } 

    /// <summary> 
    /// Invoked when this page is about to be displayed in a Frame. 
    /// </summary> 
    /// <param name="e">Event data that describes how this page was reached. The Parameter 
    /// property is typically used to configure the page.</param> 
    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
    } 

    private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     var vm = (viewmodel)DataContext; 
     vm.SetTestProperty(); 
    } 
} 

public class viewmodel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private string _TestProperty; 

    public void SetTestProperty() 
    { 
     this.TestProperty = "Set Test Property"; 
    } 

    public string TestProperty{ 
     get 
     { 
      return this._TestProperty; 
     } 
     set 
     { 
      this._TestProperty = value; 

      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs("TestProperty")); 
      } 

      Debug.WriteLine("this._TestProperty = " + this._TestProperty); 
     } 
    } 
} 

我的XAML代碼爲什麼叫兩次。這是預期的行爲?

回答

8

一般來說,你應該檢查是否值實際改變,發射一個PropertyChanged事件之前,否則你可能會進入綁定更新的infinte週期。在你的情況下,文本框可能會檢查更改,防止這種循環。

public string TestProperty{ 
    set 
    { 
     if(this._TestProperty == value) 
     { 
      return; 
     } 

     this._TestProperty = value; 

     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs("TestProperty")); 
     }    
    } 
} 
+0

你,先生,是一個GENUIS。感謝了很多人 – 2013-04-24 14:24:56