2010-04-18 15 views
6

XAML:ag_e_parser_bad_property_value Silverlight Binding Pagina Titolo

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

C#

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

Ottenere un errore di ag_e_parser_bad_property_value nella InitializeComponent nel punto in cui il titolo di legame sta accadendo. Ho provato ad aggiungere testo statico che funziona bene. Se uso il binding altrove, ad esempio:

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

Anche questo non funziona.

Suppongo che si stia lamentando perché l'oggetto DataContext non è impostato, ma se inserisco un punto di interruzione prima di InitializeComponent, posso confermare che è popolato e la proprietà Name è impostata.

Qualche idea?

risposta

8

È possibile utilizzare solo il binding di dati su proprietà supportate da DependencyProperty. Se dai uno sguardo ai documenti per , ad esempio, troverai che la proprietà Text ha un campo statico pubblico di tipo TextProperty pubblico di tipo DependencyProperty.

Se si osservano i documenti per Page, si scopre che non è stato definito TitleProperty, la proprietà Title non è quindi una proprietà di dipendenza.

Modifica

Non v'è alcun modo di "ignorare" questo però si potrebbe creare una proprietà allegata: -

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 

} 

Ora la pagina XAML potrebbe apparire un po 'come: -

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

ah capisco. Presumo che non ci sia modo di ignorare questo? – zXynK

+0

@zXynK: una proprietà associata probabilmente funzionerebbe nel tuo caso, modifica la risposta per mostrare come è fatto. – AnthonyWJones

+0

Grazie per il vostro aiuto. – zXynK

0

Aggiungere il seguente alla 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("")); 

Dopo aver aggiunto questa proprietà (proprietà di dipendenza) al codice sottostante, il codice funzionerà normalmente.