2010-04-18 70 views
6

XAML:AG_E_PARSER_BAD_PROPERTY_VALUE Silverlight中綁定頁面標題

<navigation:Page ... Title="{Binding Name}"> 

C#

public TablePage() 
{ 
    this.DataContext = new Table() 
    { 
     Name = "Finding Table" 
    }; 
    InitializeComponent(); 
} 

在其中標題綁定發生點在獲取一的InitializeComponent錯誤AG_E_PARSER_BAD_PROPERTY_VALUE。我試過添加靜態文本,它工作正常。如果我在其他地方使用綁定,例如:

<TextBlock Text="{Binding Name}"/> 

這也行不通。

我猜這是抱怨,因爲DataContext對象沒有設置,但如果我在InitializeComponent之前放置一個斷點,我可以確認它被填充並設置Name屬性。

任何想法?

回答

8

您只能在DependencyProperty支持的屬性上使用數據綁定。例如,如果您查看TextBlock的文檔,您會發現Text屬性與DependencyProperty類型的公共靜態字段具有匹配的TextProperty

如果您查看Page的文檔,您會發現沒有定義TitleProperty,因此Title屬性不是依賴項屬性。

編輯

有沒有辦法 「越權」 這可是你可以創建一個附加屬性: -

public static class Helper 
{ 
    #region public attached string Title 
    public static string GetTitle(Page element) 
    { 
     if (element == null) 
     { 
      throw new ArgumentNullException("element"); 
     } 
     return element.GetValue(TitleProperty) as string; 
    } 

    public static void SetTitle(Page element, string value) 
    { 
     if (element == null) 
     { 
      throw new ArgumentNullException("element"); 
     } 
     element.SetValue(TitleProperty, value); 
    } 

    public static readonly DependencyProperty TitleProperty = 
      DependencyProperty.RegisterAttached(
        "Title", 
        typeof(string), 
        typeof(Helper), 
        new PropertyMetadata(null, OnTitlePropertyChanged)); 

    private static void OnTitlePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     Page source = d as Page; 
     source.Title = e.NewValue as string; 
    } 
    #endregion public attached string Title 

} 

現在你的頁面的XAML可能看起來有點像: -

<navigation:Page ... 
    xmlns:local="clr-namespace:SilverlightApplication1" 
    local:Helper.Title="{Binding Name}"> 
+0

啊我明白了。我假設沒有辦法重寫這個? – zXynK 2010-04-18 19:20:21

+0

@zXynK:附加屬性可能適用於您的情況,編輯答案以顯示如何完成。 – AnthonyWJones 2010-04-18 20:07:26

+0

感謝您的幫助。 – zXynK 2010-04-19 20:19:43

0

將以下內容添加到MyPage.xaml.cs中:

public new string Title 
{ 
    get { return (string)GetValue(TitleProperty); } 
    set { SetValue(TitleProperty, value); } 
} 
public static readonly DependencyProperty TitleProperty = 
    DependencyProperty.Register("Title", 
     typeof(string), 
     typeof(Page), 
     new PropertyMetadata("")); 

一旦您將此屬性(依賴項屬性)添加到您的代碼後面,您的代碼將正常工作。