2010-04-18 13 views
6

XAML:ag_e_parser_bad_property_value Silverlight Encuadernación Título de

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

C#

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

Conseguir un error en ag_e_parser_bad_property_value InitializeComponent en el punto donde la unión del título está sucediendo. Intenté agregar texto estático que funciona bien. Si utilizo el enlace en cualquier otro lugar, por ejemplo:

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

Esto tampoco funciona.

Supongo que se está quejando porque el objeto DataContext no está configurado, pero si pongo un punto de interrupción antes de InitializeComponent puedo confirmar que se ha completado y que se ha establecido la propiedad Name.

¿Alguna idea?

Respuesta

8

Solo puede usar el enlace de datos en las propiedades compatibles con DependencyProperty. Si echa un vistazo a los documentos para TextBlock, por ejemplo, encontrará que la propiedad Text tiene un campo público estático TextProperty correspondiente de tipo DependencyProperty.

Si nos fijamos en la documentación para Page se dará cuenta de que no hay TitleProperty definido, la propiedad Title por lo tanto no es una propiedad de dependencia.

Editar

No hay manera de "anular" Sin embargo, esto puede crear una propiedad adjunta: -

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 

} 

Ahora su xaml página podría parecer un poco como: -

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

ah veo. ¿Supongo que no hay forma de anular esto? – zXynK

+0

@zXynK: una propiedad adjunta probablemente funcione en su caso, edite la respuesta para mostrar cómo se hace eso. – AnthonyWJones

+0

Gracias por su ayuda. – zXynK

0

Agregue lo siguiente a 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("")); 

Una vez que agrega esta propiedad (propiedad de dependencia) a su código, su código funcionará normalmente.