【问题标题】:One ViewModel, multiple Views: Restrict access to Properties by Interfaces一个 ViewModel,多个 View:通过接口限制对属性的访问
【发布时间】:2014-09-04 08:59:17
【问题描述】:

我正在尝试在多个视图上共享一个 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 中定义的每个属性的访问权限。

有什么办法可以解决这个问题,或者这是一个糟糕的模式吗?

【问题讨论】:

  • 它可能会使用反射来处理绑定,而不是解析为 基本类型,因此您施加的任何基于类型的限制都是无用的。
  • 那么,没有办法限制访问,我总是不得不公开我的基类的每个属性?

标签: c# wpf mvvm binding


【解决方案1】:

而不是解析为基本类型WPF data-binding uses reflection。查看来自 MSDN 的引用:

使用 Microsoft .NET 解析绑定引用 框架反射或 ICustomTypeDescriptor。这里有三个 为绑定 [...] 解析对象引用的方法。

也许一种方法是 implementing ICustomTypeDescriptor on derived classesBaseViewModel,而不是使用自定义接口:

ICustomTypeDescriptor 接口允许对象提供类型 关于自身的信息。通常,此接口用于 对象需要动态类型信息。相比之下,TypeDescriptor 类提供从元数据中获取的静态类型信息 [...]

【讨论】:

  • 谢谢,我宁愿坚持单一的 ViewModel 实现还是暴露所有的特性,因为我觉得,努力不值得隐藏属性的好处。
  • @flix 也许,你知道,我们这样做是为了构建好的设计,但有时我们需要限制我们的期望以使其适应实际问题......
  • 哈哈,你说得对。我会投票赞成这个,但不幸的是我没有积分。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
  • 1970-01-01
  • 2016-10-20
  • 2013-06-12
相关资源
最近更新 更多