2017-10-18 2 views
0

J'ai une fenêtre WPF simple avec un curseur et deux blocs de texte. Lorsque le curseur se déplace, il met à jour un objet lié aux données. Maintenant, le premier bloc de texte est mis à jour alors que le second ne le fait pas. Pourquoi?Wpf Databound TextBlock ne pas mettre à jour

Vous pouvez dire qu'il n'y a pas INotifyPropertyChanged ici. Mais alors pourquoi la première mise à jour? J'ai assez tiré mes cheveux. S'il vous plaît aider.

Mon application WPF dans toute sa splendeur est la suivante.

<Window x:Class="DataTriggerDemo.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:DataTriggerDemo" 
      mc:Ignorable="d" 
      Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition/> 
      <RowDefinition/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 

     <Slider x:Name="MySlider" Margin="5" Minimum="0" Maximum="100" 
        Value="{Binding TheValue}"/> 
     <TextBlock Grid.Row="1" Text="{Binding TheValue}" /> 
     <TextBlock Grid.Row="2" Text="{Binding TheValueTwice}" /> 
    </Grid> 
</Window> 

Et maintenant le code derrière.

using System.Windows; 
namespace DataTriggerDemo 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      DataContext = new DataObject(); 
     } 
    } 

    public class DataObject 
    { 
     private int _theValue; 
     public int TheValue 
     { 
      get { return _theValue; } 
      set { 
       _theValue = value; 
       TheValueTwice = _theValue * 2; 
      } 
     } 
     private int _theValueTwice; 
     public int TheValueTwice 
     { 
      get { 
       return _theValueTwice; 
      } 
      set { 
       _theValueTwice = value; 
      } 
     } 
    } 
} 
+1

Peut-être parce que TheValue passe de WPF en TheValueTwice est modifié par votre code. – Console

Répondre

1

En fait, vous rencontrez un autre aspect caché de WPF, voilà les données de WPF moteur de liaison seront données se lier à l'instance PropertyDescriptor qui enveloppe la propriété source si l'objet source est un objet CLR simple et ne met pas en oeuvre INotifyPropertyChanged interface. Et le moteur de liaison de données essaiera de s'abonner à l'événement modifié par la propriété PropertyDescriptor.AddValueChanged(). Et lorsque l'élément lié de données cible change les valeurs de propriété, le moteur de liaison de données appelle la méthode PropertyDescriptor.SetValue() pour renvoyer la valeur modifiée à la propriété source et déclenche simultanément l'événement ValueChanged pour avertir les autres abonnés (dans ce cas, les autres abonnés seront les TextBlocks au sein de la zone de liste

S'il vous plaît se référer à:. https://social.msdn.microsoft.com/Forums/vstudio/en-US/9365bb6a-b411-4967-9a03-ae2a810fb215/data-binding-without-inotifypropertychanged?forum=wpf