使用表达式在另一个类中使用RaisePropertyChanged

时间:2013-11-30 17:35:21

标签: c# lambda delegates expression

解决

我一直在寻找一段时间,我找不到解决方案。也许是因为我的表达不太流利。

我想要做的是从Class1中提升Class2中的属性更改。当我传递要更新的属性的字符串时,我可以这样做。我想要的是使用表达式来避免拼写错误。

当我使用字符串来定义要在class2中更新的参数时,下面的原型非常有效。

我使用事件聚合器来传播要更新的属性。

我的Class1看起来像这样:

public class Class1
{
    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            RaiseClass2PropertyChanged(() => Name);
        }
    }

    private void RaiseClass2PropertyChanged(Expression<Func<Class2>> expression)
    {
        ServiceLocator.EventAggregator
                      .GetEvent<UpdateClass2Property>().Publish(expression);
    }
}

在class2中,我有:

public class Class2
{
    public Class2 (IEventAggregator evt)
    {
        evt.GetEvent<UpdateClass2Property>()
           .Subscribe(x => RaisePropertyChanged(() => x));
    }

    public string Name
    {
        get { return SomeFunction(); }
    }
}

事件:

internal class UpdateClass2Property :
    CompositePresentationEvent<Expression<Func<Class2>>> { }

当我使用RaiseClass2PropertyChanged(() => Name);时,我在编译时遇到错误:

  

无法将类型'string'隐式转换为'Class2'


编辑:(已解决)

我设法通过这样做来解决编译错误

private void RaiseClass2PropertyChanged(Expression<Func<Class2, string>> expression)
{
       ServiceLocator.EventAggregator.GetEvent<UpdateClass2Property>().Publish(expression);
}

所以现在我可以在我的Class1

中做到这一点
public string Property1
        {
            get { return _property1; }
            set { _property1 = value;
                RaiseClass2PropertyChanged(x => x.Class2Property);
            }
        }

但是现在我必须解决Class2中的问题以检索属性名称。

我设法通过在我的Class2中执行此操作来解决此问题:

public Class2(IEventAggregator evt)
        {
            evt.GetEvent<UpdateClass2Property>().Subscribe(Method);
        }

        private void Method(Expression<Func<Class2, string>> expression)
        {
            var memberExpr = expression.Body as MemberExpression;
            if (memberExpr == null)
                throw new ArgumentException("propertyExpression should represent access to a member");
            string memberName = memberExpr.Member.Name;
            RaisePropertyChanged(memberName);
        }

当然,我更改了UpdateSnapshotProperty的签名

internal class UpdateSnapshotProperty : CompositePresentationEvent<Expression<Func<SnapshotViewModel, string>>> { }

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

要进行财产更改,您需要pass on string but your expression is expecting instance of Class2

更改

private void RaiseClass2PropertyChanged(Expression<Func<Class2>> expression)

private void RaiseClass2PropertyChanged(Expression<Func<string>> expression)

另外

internal class UpdateClass2Property :
    CompositePresentationEvent<Expression<Func<Class2>>> { }

应该是

internal class UpdateClass2Property :
    CompositePresentationEvent<Expression<Func<string>>> { }