解决
我一直在寻找一段时间,我找不到解决方案。也许是因为我的表达不太流利。
我想要做的是从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>>> { }
感谢您的帮助
答案 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>>> { }