【问题标题】:UserControl Fire Event when a property changes属性更改时的 UserControl 触发事件
【发布时间】:2014-05-27 20:51:54
【问题描述】:

DocField 有一个公共 bool 属性 IsSelected
DocField 实现 INotifyPropertyChanged

我需要一个在DocField.IsSelected 更改时在UserControlDocFieldBaseB 中触发的事件。

我该怎么做?

public partial class UserControlDocFieldBaseB : UserControl
{
    private DocField docField = null;

    public UserControlDocFieldBaseB(DocField DocField)
    {
        InitializeComponent();
        docField = DocField;
    }

根据 dkozl 的评论,这就是我连接它的方式
UserControlDocFieldString 相当昂贵,所以我只想按需加载它

我怀疑我可以使用 Loaded 事件而不是 UserControl1_DataContextChanged 但这似乎可行
它也适用于 Loaded 事件

public UserControlDocFieldBaseB()
{
    InitializeComponent();
    DataContextChanged += new DependencyPropertyChangedEventHandler(UserControl1_DataContextChanged);
}
void UserControl1_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    if (sender is UserControlDocFieldBaseB)
    {
        UserControlDocFieldBaseB uc = (UserControlDocFieldBaseB)sender;
        if (uc.DataContext is DocFieldString)
        {
            if (docFieldString == null)
            {
                docFieldString = (DocFieldString)uc.DataContext;
                docFieldString.PropertyChanged += DocFieldString_PropertyChanged;
            } 
        }
    }
}
void DocFieldString_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    switch (e.PropertyName)
    {
        case "IsSelected":
            //MessageBox.Show(docFieldString.Name + " docFieldString.IsSelected " + docFieldString.IsSelected.ToString());
            if (userControlDocFieldString == null && docFieldString != null && docFieldString.IsSelected)
            {
                userControlDocFieldString = new UserControlDocFieldString(docFieldString);
                this.frmEdit.Content = userControlDocFieldString;
            }
            break;
    }
}

【问题讨论】:

  • DocField 是否为IsSelected 属性实现INotifyPropertyChanged?如果是,那么例如在Loaded 订阅DocField 的PropertyChanged 事件和UserControl 的Unloaded 事件取消订阅并传递该事件,如果它是针对IsSelected 属性的
  • @dkozl 是的 DocField 实现了 INotifyPropertyChanged。我会试试你的评论。

标签: c# .net wpf event-handling


【解决方案1】:

由于DocField 为IsSelected 属性实现INotifyPropertyChanged,您可以简单地订阅DocField 的PropertyChanged 事件,例如当控件被加载或DocField 属性被更改时,如果它是对于`IsSelected 属性

private void PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (String.IsNullOrEmpty(e.PropertyName) || e.PropertyName == "IsSelected")
    {
        //pass on the event
    }
}

【讨论】:

    猜你喜欢
    • 2011-06-01
    • 2011-02-08
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多