ag_e_parser_bad_property_value Silverlight Binding Page Title - PullRequest
6 голосов
/ 18 апреля 2010

XAML:

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

C #

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

Получение ошибки ag_e_parser_bad_property_value в InitializeComponent в точке, где происходит привязка заголовка.Я попытался добавить статический текст, который работает нормально.Если я использую привязку где-либо еще, например:

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

Это тоже не работает.

Я предполагаю, что это жалуется, потому что объект DataContext не установлен, но если я вставлюточка останова перед InitializeComponent. Я могу подтвердить, что он заполнен и свойство Name установлено.

Есть идеи?

Ответы [ 2 ]

8 голосов
/ 18 апреля 2010

Вы можете использовать привязку данных только к свойствам, которые поддерживаются DependencyProperty. Например, если вы посмотрите на документы для TextBlock, то обнаружите, что свойство Text имеет соответствующее TextProperty открытое статическое поле типа DependencyProperty.

Если вы посмотрите документы для 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 голосов
/ 15 января 2012

Добавьте следующее в 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(""));

Как только вы добавите это свойство (свойство зависимости) в свой код, ваш код будет работать как обычно.

...