2010-08-27 5 views

Répondre

0

Si vous faites référence à une liaison, vous pouvez définir le UpdateSourceTrigger Explicite, ce qui signifie que tout changement ne seront pas enregistrés tant que vous dites explicitement mettre à jour

<TextBox Text="{Binding SomeValue, UpdateSourceTrigger=Explicit}" /> 
+0

Merci Rachel ... mais je ne veux pas changer la fonctionnalité de base du UpdateSourceTrigger. voir mon UpdateSourceTrigger = PropertyChanged sera comme ceci mais je veux arrêter la mise à jour pendant un certain temps pour définir la valeur certaine, sinon il continuera à appeler la propriété. Parfois, cela prendra beaucoup de temps dépend des critères. –

1

Pour INotifyPropertyChanged travailler, vous devez augmenter l'événement PropertyChanged. Par conséquent, pour que cela ne fonctionne pas, vous ne devez pas déclencher cet événement.

Voici une petite classe exemple:

public class NPCExample : INotifyPropertyChanged 
{ 
    public NPCExample() 
    { 
    } 

    private string mSomeProperty = "Set Property"; 
    public string SomeProperty 
    { 
     get { return mSomeProperty; } 
     set 
     { 
      mSomeProperty = value; 
      if (mUseNotifyPropertyChanged) 
       NotifyPropertyChanged("SomeProperty"); 
     } 
    } 

    private Boolean mUseNotifyPropertyChanged = true; 
    public Boolean UseNotifyPropertyChanged 
    { 
     get { return mUseNotifyPropertyChanged; } 
     set 
     { 
      mUseNotifyPropertyChanged = value; 
      NotifyPropertyChanged("UseNotifyPropertyChanged"); 
     } 
    } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    #endregion 
} 

Dans cette classe, chaque propriété appelle la méthode commune « NotifyPropertyChanged » pour élever l'événement PropertyChanged. Une variable supplémentaire est définie (ici, j'ai utilisé une propriété publique pour pouvoir la lier à une case à cocher) qui indique si l'événement doit ou non être déclenché, comme dans l'événement SomeProperty.

Voici un petit programme rapide n-sale pour montrer en action: XAML

<Window x:Class="MyNamespace.SelectiveNotifyPropertyChanged" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="SelectiveNotifyPropertyChanged" Height="300" Width="300"> 
    <StackPanel> 
     <TextBlock Text="{Binding SomeProperty}" /> 
     <CheckBox x:Name="chkINPCEnabled" 
        Content="Enable INotifyPropertyChanged" 
        IsChecked="{Binding UseNotifyPropertyChanged}"></CheckBox> 
     <StackPanel Orientation="Horizontal"> 
      <TextBox x:Name="txtIsProperty" 
        Text="Set Property" /> 
      <Button x:Name="btnSetProperty" 
        Content="Set Property" /> 
     </StackPanel> 
    </StackPanel> 
</Window> 

code Derrière

using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Shapes; 

namespace MyNamespace 
{ 
    /// <summary> 
    /// Interaction logic for SelectiveNotifyPropertyChanged.xaml 
    /// </summary> 
    public partial class SelectiveNotifyPropertyChanged : Window 
    { 

     public SelectiveNotifyPropertyChanged() 
     { 
      InitializeComponent(); 
      NPCExample example = new NPCExample(); 
      this.DataContext = example; 

      btnSetProperty.Click += 
       (s, e) => example.SomeProperty = txtIsProperty.Text; 
     } 
    } 

    public class NPCExample : INotifyPropertyChanged 
    { 
     public NPCExample() 
     { 
     } 

     private string mSomeProperty = "Set Property"; 
     public string SomeProperty 
     { 
      get { return mSomeProperty; } 
      set 
      { 
       mSomeProperty = value; 
       if (mUseNotifyPropertyChanged) 
        NotifyPropertyChanged("SomeProperty"); 
      } 
     } 

     private Boolean mUseNotifyPropertyChanged = true; 
     public Boolean UseNotifyPropertyChanged 
     { 
      get { return mUseNotifyPropertyChanged; } 
      set 
      { 
       mUseNotifyPropertyChanged = value; 
       NotifyPropertyChanged("UseNotifyPropertyChanged"); 
      } 
     } 

     #region INotifyPropertyChanged Members 

     public event PropertyChangedEventHandler PropertyChanged; 
     private void NotifyPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 

     #endregion 
    } 
} 
0

Sur la base de votre commentaire à Rachel, il semble comme vous voudrez peut-être définir le membre de soutien de la propriété privée parfois. Pourriez-vous exposer une méthode publique dans votre classe sous-jacente qui définirait le membre privé sans appeler NotifyPropertyChaged?

Public Class SomeClass 

... define property SomeProp and m_SomeProp 

Public Sub SetSomeProp(val as string) 
    m_SomePreop=val 
End Sub 

End Class 
Questions connexes