Приложение для Windows Phone 8. Не удается отобразить данные в разметке xaml

Мне удавалось легко переносить объекты между страницами, но теперь я не могу отобразить данные в разметке xaml.

Вот объект Quote, который хранится в sdf-файле приложения:

[Table]
    public class Quote
    {
        [Column(IsPrimaryKey = true, IsDbGenerated = true, DbType = "INT NOT NULL Identity", CanBeNull = false, AutoSync = AutoSync.OnInsert)]
        public int Id { get; set; }


        [Column(CanBeNull = false)]
        public string QuoteOfTheDay { get; set; }


        [Column(CanBeNull = false)]
        public string SaidBy { get; set; }


        [Column(CanBeNull = true)]
        public string Context { get; set; }


        [Column(CanBeNull = true)]
        public string Episode { get; set; }


        [Column(CanBeNull = true)]
        public string Season { get; set; }
    }

Вот код позади:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    base.OnNavigatedTo(e);

    DataContext = this;

    var quote = PhoneApplicationService.Current.State["q"];             

    Quote quoteToDisplay = (Quote)quote;       
}

public static readonly DependencyProperty QuoteToDisplayProperty = DependencyProperty.Register(
    "QuoteToDisplay", typeof(Quote), typeof(PhoneApplicationPage), new PropertyMetadata(default(Quote)));

public Quote QuouteToDisplay
{
    get { return (Quote)GetValue(QuoteToDisplayProperty); }
    set { SetValue(QuoteToDisplayProperty, value); }
}

XAML:

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">

        <TextBlock FontSize="36" FontFamily="Verdana" FontWeight="ExtraBlack" Text="{Binding QuoteToDisplay.QuoteOfTheDay}" />
    </Grid>

Я получил точные данные, которые хочу отобразить в xaml. Я хочу отобразить свойство QuoteOfTheDay в TextBlock. Но каждый раз, когда я пытаюсь использовать {Binding}, TextBlock всегда пуст. Когда я также пытаюсь использовать Binding, intellisense не предлагает «QuoteOfTheDay».

Я явно пропустил что-то важное, но я не могу понять, что именно.


person Assassin87    schedule 10.06.2014    source источник


Ответы (2)


Беглый взгляд на ваш код показывает несколько проблем:

  1. Вы инициализируете TextBlock в своем коде C#, присваивая ему то же имя, что и TextBlock, который вы определили в XAML. Это означает, что вы не изменяете ни одно из свойств XAML TextBlock, который фактически отображается.
  2. Вы указываете DataContext для своего TextBlock как quoteToDisplay.QuoteOfTheDay, но тогда ваша инструкция привязки в XAML имеет значение {Binding quoteToDisplay.QuoteOfTheDay}, что означает, что вы пытаетесь выполнить привязку к несуществующей иерархии quoteToDisplay.QuoteOfTheDay.quoteToDisplay.QuoteOfTheDay. Вы, вероятно, получаете ошибку BindingExpression в окнах вывода из-за этой ошибки.

Я бы сделал следующее:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    base.OnNavigatedTo(e);

    DataContext = this;

    var quote = PhoneApplicationService.Current.State["q"];

    QuoteToDisplay = (Quote)quote;
}

public static readonly DependencyProperty QuoteToDisplayProperty = DependencyProperty.Register(
    "QuoteToDisplay", typeof (Quote), typeof (MainPage), new PropertyMetadata(default(Quote)));

public Quote QuoteToDisplay
{
    get { return (Quote) GetValue(QuoteToDisplayProperty); }
    set { SetValue(QuoteToDisplayProperty, value); }
}

И в XAML:

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    <TextBlock FontSize="36" FontFamily="Verdana" FontWeight="ExtraBlack" Text="{Binding QuoteToDisplay.QuoteOfTheDay}" />
</Grid>
person eshaham    schedule 10.06.2014
comment
Я не совсем понимаю требуемый параметр MyFilterLogic. Почему вам нужно создать класс FilterLogic для метода Register? - person Assassin87; 10.06.2014
comment
Я примерно то же самое написал. :) Только одно отличие - я не фанат перезаписи DataContext страниц/UserControls. Я бы предпочел изменить DataContext сетки или TextBlock. Или установите Binding в коде (если я хочу привязываться к текущей странице/UserControl, а не к исходному DataContext). - person yasen; 10.06.2014
comment
Спасибо @eshaham, но, к сожалению, я продолжаю получать ту же ошибку. На странице вообще не отображается цитата в текстовом блоке. - person Assassin87; 10.06.2014
comment
На самом деле ошибки нет, но та же проблема, что и раньше. По какой-то причине текст не отображается в текстовом блоке на странице. - person Assassin87; 10.06.2014
comment
Я ничего не вижу, есть ли у вас какие-либо ошибки BindingExpression или другие исключения в окне вывода? - person eshaham; 10.06.2014
comment
@eshaham Я нашел в окне вывода это исключение. Ошибка System.Windows.Data: ошибка пути BindingExpression: свойство «ItemName» не найдено в «Beavis_and_Butthead_Quote_of_the_Day.MainPage», «Beavis_and_Butthead_Quote_of_the_Day.MainPage» (HashCode = 58206383). BindingExpression: Path='ItemName' DataItem='Beavis_and_Butthead_Quote_of_the_Day.MainPage' (HashCode=58206383); целевой элемент — «System.Windows.Controls.TextBlock» (Name=''); целевое свойство — «Текст» (тип «System.String»). - person Assassin87; 10.06.2014
comment
Я сделал еще одно обновление для части С#, но мне кажется, что ошибка показывает, что выражение привязки, которое у вас есть в TextBlock, отличается от того, что вы написали в своем вопросе. Причина, по которой я подозреваю, что это другое, заключается в том, что в ошибке упоминается ItemName, которого нет в исходном XAML. - person eshaham; 10.06.2014
comment
@eshaham, меня не было некоторое время, но теперь я вернулся, чтобы попытаться решить эту проблему. Когда я отлаживал приложение, я заметил, что свойство зависимости равно null. Свойство QuoteToDisplay по какой-то причине также равно null. Как найти и установить свойство ItemName? - person Assassin87; 18.06.2014
comment
@ Assassin87 Извините, теперь моя очередь отлучиться на некоторое время... :-) Надеюсь, вы уже решили свою проблему. Если нет, пожалуйста, обновите свой пост более полным образцом - я не знаю, что означает ItemName, я предполагаю, что это как-то связано с вашим кодом. - person eshaham; 30.06.2014
comment
@eshaham, я решил это без использования свойства зависимости. Я только что присвоил значение свойства text в коде позади. Иногда все, что вам нужно сделать, это закрыть эмулятор, а затем перезапустить его при следующей отладке приложения. Тогда нормально работало :) - person Assassin87; 30.06.2014
comment
@assassin87 приятно слышать! - person eshaham; 30.06.2014

Почему вы используете {Binding}, если вы назначаете свойство .Text в коде программной части? Я думаю, вы должны удалить привязку из xaml или (и это лучше) использовать MVVM.

person IL_Agent    schedule 10.06.2014