【发布时间】:2016-06-08 15:48:34
【问题描述】:
我有EntitiesUserControl 负责EntitiesCount 依赖属性:
public static readonly DependencyProperty EntitiesCountProperty = DependencyProperty.Register(
nameof(EntitiesCount),
typeof(int),
typeof(EntitiesUserControl),
new FrameworkPropertyMetadata(1, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public int EntitiesCount
{
get { return (int)this.GetValue(EntitiesCountProperty); }
set { this.SetValue(EntitiesCountProperty, value); }
}
另一个(主)控件包括EntitiesUserControl并通过绑定读取它的属性:
<controls:EntitiesUserControl EntitiesCount="{Binding CountOfEntities, Mode=OneWayToSource}" />
CountOfEntities视图模型中的属性只是存储和处理计数值的变化:
private int countOfEntities;
public int CountOfEntities
{
protected get { return this.countOfEntities; }
set
{
this.countOfEntities = value;
// Custom logic with new value...
}
}
我需要EntitiesUserControl 的EntitiesCount 属性为只读(主控件不能更改它,只需读取),它之所以这样工作,是因为Mode=OneWayToSource 明确声明。但是如果声明TwoWay 模式或不显式声明模式,则EntitiesCount 可以从外部重写(至少在绑定初始化之后,因为它发生在分配默认依赖属性值之后)。
由于绑定限制(在此answer 中进行了最佳描述),我无法执行“合法”只读依赖属性,因此我需要防止使用OneWayToSource 以外的模式进行绑定。最好在 FrameworkPropertyMetadataOptions 枚举中有一些 OnlyOneWayToSource 标志,例如 BindsTwoWayByDefault 值...
有什么建议可以实现吗?
【问题讨论】:
-
我不确定使用
Mode=OneWayToSource有什么问题。唯一的问题是您必须输入它还是什么?抱歉,我不太了解这里的问题。我将分享一种仅实现OneWayToSource绑定的 hacky 方法,但不确定这是否是您所需要的。 -
@SzabolcsDézsi 问题不在于我必须输入,问题恰恰相反——我可能不会输入,什么也没有会告诉我,我将以不应该使用的方式使用财产。打个比方——如果你编写的代码为只读属性赋值,你就无法编译程序。
-
@Sam FWIW 我同意你的观点,也希望看到一个优雅的解决方案。但是 XAML 或 WPF 似乎没有任何内容支持您所指的安全理念:(
标签: c# wpf xaml data-binding dependency-properties