一个ViewModel,多个视图:按接口限制对属性的访问

本文关键字:属性 访问 接口 ViewModel 视图 一个 | 更新日期: 2023-09-27 18:20:47

我正试图在多个视图上共享一个BaseViewModel。因此,我想让ViewModel实现不同的接口,每个视图一个。

public class BaseViewModel : IBaseViewModelTypeI, IBaseViewModelTypeII {
    public PropertyI { get; set; }
    public PropertyII { get; set; }
}
public interface IBaseViewModelTypeI {
    PropertyI { get; set; }
}
public interface IBaseViewModelTypeII {
    PropertyII { get; set; }
} 

在我的视图中,我想将ViewModel设置为DataContext,并仅将接口中实现的属性公开为可绑定属性。

但WPF似乎解析为BaseViewModel的BaseType,因此公开了对BaseViewModel中定义的每个属性的访问。

有没有办法解决这个问题,或者这是一个糟糕的模式?

一个ViewModel,多个视图:按接口限制对属性的访问

WPF数据绑定使用反射,而不是解析为基类型。查看MSDN上的报价:

绑定引用是通过使用Microsoft.NET解析的框架反射或ICustomTypeDescriptor。这里有三个解析绑定的对象引用的方法〔…〕.

也许一种方法是在BaseViewModel的派生类上实现ICustomTypeDescriptor,而不是使用自定义接口:

ICustomTypeDescriptor接口允许对象提供类型关于自身的信息。通常,当对象需要动态类型信息。相反,TypeDescriptor类提供从元数据中获得的静态类型信息〔…〕