开发者

INotifyPropertyChanged Not Working

I am using INotifyPropertyChanged but it will give me null when I shaw the PropertyChanged so what i can do.. my code is like this..

public class Entities : INotifyPropertyChanged
{

    public Entities(int iCount)
    {
        _iCounter = iCount;
    }


    private int _iCounter;
    public int iCounter
    {
        get
        {
            return _iCounter;
        }
        set
        {
            value = _iCounter;
            NotifyPropertyChanged("iCounter");
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion

    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(th开发者_开发问答is, new PropertyChangedEventArgs(info));
        }
    }
}

Thanks...


I tried putting your code in my program and it is working fine. I am getting the EventArg as the property:

class Program
    {
        static void Main(string[] args)
        {
            var ent = new Entities(10);
            ent.PropertyChanged += new PropertyChangedEventHandler(ent_PropertyChanged);
            ent.iCounter = 100;
        }

        static void ent_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            throw new NotImplementedException();
        }
    }


    public class Entities : INotifyPropertyChanged
    {

        public Entities(int iCount)
        {
            _iCounter = iCount;
        }
        private int _iCounter;
        public int iCounter
        {
            get
            {
                return _iCounter;
            }
            set
            {
                _iCounter = value;
                NotifyPropertyChanged("iCounter");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }
    }

What is the exact erro you are getting?


This is i think a bug in INotifyPropertyChanged .

There can be 2 workaround

1st Workaround

1- Assign iCounter property to a UI control like Lable.

2- Now change the value of the property this time , PropertyChanged event will have a reference of your method and will not be null;

2nd workaround

Assign PropertyChanged delegate in the Entities class constructor

i am giving the demo code in WPF

<Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>

        <Grid.Resources>
            <ToolTip x:Key="@tooltip">
                <TextBlock Text="{Binding CompanyName}"/>
        </ToolTip>
        </Grid.Resources>

        <TextBlock Text="{Binding Name}" Background="LightCoral" />
    <Rectangle Width="200" Height="200" Fill="LightBlue" VerticalAlignment="Center" HorizontalAlignment="Center" ToolTip="{DynamicResource @tooltip}" Grid.Row="1"/>
    <Button Click="Button_Click" Grid.Row="2" Margin="20">Click Me</Button>
</Grid>

see here CompanyName is assigned to a tool tip.

// this is Window1.Cs file public Window1() { DataContext = DemoCustomer.CreateNewCustomer(); InitializeComponent(); }

// Now DemoCustomer Class

    public class DemoCustomer : INotifyPropertyChanged
{
    // These fields hold the values for the public properties.
    private Guid idValue = Guid.NewGuid();
    private string customerName = String.Empty;
    private string companyNameValue = String.Empty;
    private string phoneNumberValue = String.Empty;

    public event PropertyChangedEventHandler PropertyChanged;



    protected void OnPropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    // The constructor is private to enforce the factory pattern.
    private DemoCustomer()
    {
        customerName = "no data";
        companyNameValue = "no data";
        phoneNumberValue = "no data";
    }

    // This is the public factory method.
    public static DemoCustomer CreateNewCustomer()
    {
        return new DemoCustomer();
    }

    // This property represents an ID, suitable
    // for use as a primary key in a database.
    public Guid ID
    {
        get
        {
            return this.idValue;
        }
    }

    public string CompanyName
    {
        get { return this.companyNameValue; }

        set
        {
            if (value != this.companyNameValue)
            {
                this.companyNameValue = value;
                OnPropertyChanged("CompanyName");
            }
        }
    }
    public string PhoneNumber
    {
        get { return this.phoneNumberValue; }

        set
        {
            if (value != this.phoneNumberValue)
            {
                this.phoneNumberValue = value;
                OnPropertyChanged("PhoneNumber");
            }
        }
    }
}

and finally changing the value

 private void Button_Click(object sender, RoutedEventArgs e)
    {
        DemoCustomer dc = this.DataContext as DemoCustomer;

        dc.CompanyName = "Temp";


    }
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜