首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >只允许OneWayToSource绑定模式

只允许OneWayToSource绑定模式
EN

Stack Overflow用户
提问于 2016-02-25 17:49:00
回答 1查看 1.5K关注 0票数 4

我让EntitiesUserControl负责EntitiesCount依赖项属性:

代码语言:javascript
代码运行次数:0
运行
复制
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并通过绑定读取它的属性:

代码语言:javascript
代码运行次数:0
运行
复制
<controls:EntitiesUserControl EntitiesCount="{Binding CountOfEntities, Mode=OneWayToSource}" />

视图模型中的CountOfEntities属性只存储和处理计数值的更改:

代码语言:javascript
代码运行次数:0
运行
复制
private int countOfEntities;
public int CountOfEntities
{
    protected get { return this.countOfEntities; }
    set
    {
        this.countOfEntities = value;
        // Custom logic with new value...
    }
}

我需要EntitiesCount属性的EntitiesUserControl只读(主控件不能更改它,只需读取),而且它的工作方式仅是因为Mode=OneWayToSource显式声明。但是,如果声明TwoWay模式或不显式声明模式,那么EntitiesCount可以从外部重写(至少在绑定初始化之后,因为在指定默认依赖项属性值之后发生)。

由于绑定限制(最好在此answer中描述),我无法执行“合法”只读依赖属性,因此我需要防止使用OneWayToSource以外的模式进行绑定。最好在OnlyOneWayToSource枚举中有一些像BindsTwoWayByDefault值这样的FrameworkPropertyMetadataOptions标志.

有何建议可以做到这一点?

EN

回答 1

Stack Overflow用户

发布于 2016-02-25 19:13:53

这是一个“位”黑客,但您可以创建一个Binding-derived类,并使用它而不是Binding

代码语言:javascript
代码运行次数:0
运行
复制
[MarkupExtensionReturnType(typeof(OneWayToSourceBinding))]
public class OneWayToSourceBinding : Binding
{
    public OneWayToSourceBinding()
    {
        Mode = BindingMode.OneWayToSource;
    }

    public OneWayToSourceBinding(string path) : base(path)
    {
        Mode = BindingMode.OneWayToSource;
    }

    public new BindingMode Mode
    {
        get { return BindingMode.OneWayToSource; }
        set
        {
            if (value == BindingMode.OneWayToSource)
            {
                base.Mode = value;
            }
        }
    }
}

在XAML中:

代码语言:javascript
代码运行次数:0
运行
复制
<controls:EntitiesUserControl EntitiesCount="{local:OneWayToSourceBinding CountOfEntities}" />

名称空间映射local可能对您来说是另一回事。

OneWayToSourceBindingMode设置为OneWayToSource,并防止将其设置为任何其他内容。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35634609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档