2015-10-20 1 views
3

Почему вызов C# -getter вызывается дважды, если я пишу письмо в TextBox?C# getter вызывается дважды на входе

В моей точке зрения это любопытно, потому что только один элемент (Label) привязывается к свойству для получения значений.

Это моя XAML:

<Window x:Class="BindingDebug.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:BindingDebug" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="30" /> 
      <RowDefinition Height="30" /> 
      <RowDefinition Height="30" /> 
      <RowDefinition Height="30" /> 
     </Grid.RowDefinitions> 

     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="auto" /> 
      <ColumnDefinition Width="*" /> 
     </Grid.ColumnDefinitions> 

     <Label Grid.Row="0" Grid.Column="0" Content="Firstname" /> 
     <TextBox Grid.Row="0" Grid.Column="1" x:Name="firstNameTextBox" Height="24" VerticalAlignment="Center" HorizontalAlignment="Stretch" 
        Text="{Binding FirstName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 

     <Label Grid.Row="1" Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Left" Content="{Binding FirstName}" /> 
    </Grid> 
</Window> 

код позади:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     this.DataContext = new Model(); 
    } 
} 

модель

public class Model : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private string firstName; 

    public string FirstName 
    { 
     get 
     { 
      System.Diagnostics.Debug.WriteLine("Get: " + firstName ?? ""); 
      return firstName; 
     } 

     set 
     { 
      firstName = value; 
      System.Diagnostics.Debug.WriteLine("Set: " + value ?? ""); 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs("FirstName")); 
      } 
     } 
    } 
} 

Или это правильно, что геттер вызывается дважды? Выход отладки выводится на окно вывода Visual Studio.

Спасибо!

+0

Это просто и понятно, у вас есть 2 управления 'TextBox' и' label', оба связаны с 'FirstName'. Таким образом, геттер запускается дважды. –

+0

Я бы добавил первую строку, если (firstName == value) return: – Paparazzi

ответ

6

Отправлено Microsoft 28.04.2010 в 10:10. Это не ошибка. WPF (или любой другой код) может вызвать ваше свойство-геттер в любое время по любой причине; нет правила, что он будет вызван только один раз. WPF (и другие абоненты) ожидает, что ваше свойство следует за рекомендациями .Net; в частности, что свойство-getter работает быстро и что оно вернет одно и то же значение от вызова к вызову, если вы не вызвали уведомление об изменении свойства.

Смотрите здесь для ссылки и т.д.: WPF Binding View as Content

+0

Отлично, спасибо! – BendEg

+0

Я думаю, что геттеры также не должны создавать побочные эффекты (печать на консоль является особенно мягкой) –

+0

Да, я знаю, мне было интересно только, почему это происходит. спасибо – BendEg