2015-07-04 26 views
2

我需要通過在Windows Phone 8的綁定表達式來設置一個RichTextBox用戶控制的XAML屬性,我發現,這是不是一個DP,所以我決定從RichTextBox繼承並添加一個DP,它將使用PropertyChanged事件更改Xaml屬性,無論如何代碼看起來像這樣,剝離出不相關的部分。綁定的自定義依賴屬性獲取數據綁定到字符串不能轉換例外

public class RichTextBoxWithBindableXaml : RichTextBox 
{ 
    public string BindableXaml 
    { 
     get { return (string)GetValue(BindableXamlProperty); } 
     set { SetValue(BindableXamlProperty, value); } 
    } 
    public static readonly DependencyProperty BindableXamlProperty = 
     DependencyProperty.Register("BindableXaml", 
            typeof(string), 
            typeof(RichTextBoxWithBindableXaml), 
            new PropertyMetadata(0));  
} 

//xaml code 

<local:RichTextBoxWithBindableXaml BindableXaml="{Binding PageContent , Mode=OneWay}"> </local:RichTextBoxWithBindableXaml> 

而且我得到以下異常可怕的消息: 對象類型「System.Windows.Data.Binding」不能轉換爲類型「System.String」。

我已經檢查到這些異常和數據綁定,並通過右側的建議類似的問題仍在繼續,仍然不明白爲什麼一件簡單的事情不會對我的工作類似問題的許多解決方案。上面列出的代碼只是具有綁定表達式的DP的最簡單實現。順便說一句,源PageContent來自INotifyPropertyChanged對象,它的工作原理,我知道,因爲它可以綁定到TextBlock的Text屬性。

我失去了一些東西如此明顯?我不想爲這樣簡單的事情發表問題,但我似乎無法以任何方式解決問題。

編輯: 繼P.S音符竟然是完全不相干的。

P.S.我最後的疑問是xmlns命名空間local加載的方式。它被加載爲clr程序集,xaml解析器可能認爲我的自定義繼承類爲clr-only,並且由於clr屬性不是依賴項屬性而引起混淆。希望它聽起來不笨,我絕望。這是因爲這樣:

xmlns:local="clr-namespace:RumCli" 

回答

0

對於每個依賴屬性一個必須提供一個非訂閱值(不是C#這裏術語),該套件對象,消費者將訪問的類型。

引述MSDN Dependency Property Metadata

依賴屬性的元數據作爲存在能夠被查詢以檢查依賴項屬性的特性的對象。

所以對於value類型的結果,對於不同的值類型,諸如double一個默認使用double.NaN。 A decimal使用decimal.Zero。而一個字符串,string.empty是一個很好的基礎。

這允許任何可能盲目的操作反映關閉屬性,它可以確定它的真正屬性類型是什麼,並相應地訪問它。

因此,將0分配給string在識別該屬性是string(其將0標識爲整數)時沒有意義。因此intstring正在設置將來的運行時失敗,當對象試圖爲其分配綁定,樣式和其他項目時。

1

我發現我應該或者提供空PropertyMetadata(新PropertyMetadata(空)而不是0),或具有缺省值類型元數據,如果DP是應該使用在Xaml。對於我的場景,由於我將使用PropertyChangedCallback,傳遞給Register方法的propertymetadata看起來像這樣。

new PropertyMetadata(default(string), new PropertyChangedCallback(OnBindableXamlChanged)) 

希望對別人有幫助。

+0

有關詳細說明,請查看下面的OmegaMan答案。 – bahti