UserControl中的INotifyPropertyChanged

时间:2012-09-17 19:54:13

标签: c# silverlight-4.0

我有一个继承自TextBox控件的自定义控件。 我想在我的自定义控件中实现INotifyPropertyChanged接口。

public class CustomTextBox : TextBox, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void NotifyPropertyChanged(string info)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(info));
    }
}

我的问题是当我尝试引发PropertyChanged事件时,PropertyChanged事件处理程序始终为null。

任何人都可以帮助我?

3 个答案:

答案 0 :(得分:13)

  

PropertyChanged事件处理程序为空。

在订阅PropertyChanged事件之前,这将始终为真。

通常,如果您要制作自定义控件,则不会使用INotifyPropertyChanged。在这种情况下,您可以改为Custom Dependency Property。通常,依赖项对象(即:控件)都将使用依赖项属性,而INPC由成为这些对象的DataContext的类使用。这允许绑定系统正常工作。

答案 1 :(得分:7)

你期待什么? PropertyChanged事件由UI代码使用,但在您写作的意义上并非如此。控件从不实现INPC(INotifyPropertyChanged的简称),它们绑定到已实现 INPC的对象。这种方式某些UI属性,例如TextBox控件上的 Text 属性绑定到此类上的属性。这是MVVM架构的基础。

示例,您将编写以下XAML代码:

<TextBlock x:Name="txtBox" Text="{Binding Title}" />

您可以按以下方式在代码中设置TextBlock(或其任何祖先,DataContext的传播)的数据上下文:

txtBox.DataContext = new Movie {Title = "Titanic"};

现在为班级本身:

public class Movie : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void NotifyPropertyChanged(string info)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(info));
    }

    private string _title;
    public string Title
    {
        get { return _title; }
        set
        {
            if (_title == value) return;

            _title = value;
            NotifyPropertyChanged("Title");
        }
    }
}

现在,无论何时更改Title属性,无论是在代码中还是通过其他绑定,UI都将自动刷新。 Google for Data Binding和MVVM。

答案 2 :(得分:4)

就像我在评论中说的那样。 它不像你那样工作。只需创建一个额外的类并在那里实现Notification Interface并将此类应用于DataContext的{​​{1}}。它会像你需要的那样工作。

UserControl