如何在WPF中禁用所有或部分属性PropertyChanged事件?

时间:2010-08-27 12:20:04

标签: wpf

当我们使用INotifypropertyChanged时,如何禁用所有属性或某些属性PropertyChanged事件?

3 个答案:

答案 0 :(得分:1)

为了使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事件中所使用的那样。

这是一个小而快速的脏程序,用于显示此操作: 的 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
    }
}

答案 1 :(得分:0)

如果您指的是绑定,可以将UpdateSourceTrigger设置为Explicit,这意味着在您明确告知更新之前,任何更改都不会保存

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

答案 2 :(得分:0)

根据您对Rachel的评论,您可能有时想要设置私有属性支持成员。你可以在你的底层类中公开一个公共方法来设置私有成员而不是调用NotifyPropertyChaged吗?

Public Class SomeClass

... define property SomeProp and m_SomeProp

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

End Class