Как отключить все свойства PropertyChanged или некоторые события в WPF? - PullRequest
1 голос
/ 27 августа 2010

Как отключить все свойства или некоторые свойства события PropertyChanged на некоторое время, когда мы используем INotifypropertyChanged?

Ответы [ 3 ]

1 голос
/ 27 августа 2010

Для того, чтобы INotifyPropertyChanged работал, вам нужно вызвать событие PropertyChanged.Поэтому, чтобы это не сработало, вы просто не вызываете это событие.

Вот небольшой пример класса:

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
}

В этом классе каждое свойство вызывает общий «NotifyPropertyChanged»метод для вызова события PropertyChanged.Определена дополнительная переменная (здесь я использовал общедоступное свойство, чтобы я мог связать его с флажком), который сообщает, следует ли инициировать событие, как используется в событии SomeProperty.

Вот небольшой,программа quick-n-dirty, чтобы показать это в действии: 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>

Код позади

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 голосов
/ 27 августа 2010

Исходя из вашего комментария к Рэйчел, звучит так, что вы, возможно, захотите иногда установить бэк-участника приватной собственности.Не могли бы вы предоставить открытый метод в вашем базовом классе, который бы устанавливал закрытый член, но не вызывал NotifyPropertyChaged?

Public Class SomeClass

... define property SomeProp and m_SomeProp

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

End Class
0 голосов
/ 27 августа 2010

Если вы ссылаетесь на привязку, вы можете установить UpdateSourceTrigger на Explicit, что означает, что любые изменения не будут сохранены, пока вы явно не скажете ему обновить

<TextBox Text="{Binding SomeValue, UpdateSourceTrigger=Explicit}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...