2016-02-25 100 views
1

我有EntitiesUserControl負責EntitiesCount依賴屬性:只允許OneWayToSource裝訂模式

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... 
    } 
} 

我需要EntitiesCountEntitiesUserControl的屬性爲只讀(主控制不能更改它,只是讀取),並且它的工作原理僅僅是因爲Mode=OneWayToSource明確聲明。但是如果聲明TwoWay模式或者沒有顯式聲明模式,那麼EntitiesCount可以從外部重寫(至少在綁定初始化之後,因爲發生在默認的依賴項屬性值賦值之後)。

由於綁定限制(在此answer中最好描述),我不能執行「合法」只讀依賴項屬性,所以我需要阻止除OneWayToSource以外的其他模式的綁定。這將是最好有一些OnlyOneWayToSource標誌像FrameworkPropertyMetadataOptions枚舉BindsTwoWayByDefault值...

任何建議如何實現這一目標?

+0

我不知道我使用'Mode = OneWayToSource'出現了什麼問題。唯一的問題是你必須輸入那個或什麼?對不起,我不太在意這個問題。我會分享一個黑客的方式來實現只有'OneWayToSource'綁定,但不知道這就是你需要的。 –

+0

@SzabolcsDézsi問題不是我*必須*類型,問題只是另一種方式 - 我*可能不會*鍵入,並且沒有任何東西會告訴我,我將以它不應該使用的方式使用屬性用過的。作爲一個類比 - 如果您編寫將值分配給只讀屬性的代碼,則無法編譯程序。 – Sam

回答

1

這是一個「位」哈克,但您可以創建一個Binding派生類,並用它來代替Binding

[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:

<controls:EntitiesUserControl EntitiesCount="{local:OneWayToSourceBinding CountOfEntities}" /> 

的命名空間映射local可能別的東西給你。

OneWayToSourceBindingMode設置爲OneWayToSource,並阻止將其設置爲其他任何值。

+0

謝謝例如,它是足夠有趣的,至少我有更新使用綁定這種方式...這不完全是我需要的,但它有點相對:就像你的自定義綁定阻止使用除'OneWayToSource'以外的任何模式,我需要依賴屬性來防止綁定到除自定義綁定之外的任何綁定,或任何與「OneWayToSource」以外的任何標準綁定。 – Sam