Доступ к объекту программной части в XAML

В другом сообщении описывается, как получить доступ к переменной скрытого кода в XAML.

Однако я хотел бы получить доступ к переменной в выделенном коде объекта из XAML. Объект выделенного кода, называемый FeedData, объявлен как свойство зависимости типа FeedEntry. Этот класс представляет собой просто контейнерный класс со свойствами строки и даты и времени.

Определение свойства Codebehind таково:

public FeedEntry FeedData
        {
            get { return (FeedEntry)GetValue(FeedDataProperty); }
            set { SetValue(FeedDataProperty, value); }
        }
        public static readonly DependencyProperty FeedDataProperty =
            DependencyProperty.Register("FeedData", typeof(FeedReaderDll.FeedEntry), typeof(FeedItemUserControl), 
            new FrameworkPropertyMetadata(new FeedEntry(){ Title="Hi!", Published=DateTime.Now }));

В XAML я делаю это, что не работает:

<UserControl x:Class="FeedPhysics.UserControls.FeedItemUserControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="40" Width="200"
    Background="Blue"
    DataContext="{Binding RelativeSource={RelativeSource Self}}"
    x:Name="xRoot">
    <StackPanel>
        <TextBlock Text="{Binding Title}" Foreground="White"/>
        <TextBlock Text="{Binding Published}" Foreground="White"/>
    </StackPanel>
</UserControl>

Но если я переопределю настройку окна datacontext в конструкторе codebehind, он будет работать! Нравится:

xRoot.DataContext = FeedData;

Я понимаю, почему это работает, когда datacontext установлен в кодировке. Но я хотел бы найти способ захватывать переменные внутри объекта, который объявлен в выделенном коде. Потому что все должно быть выполнено с помощью XAML, верно?

Заранее благодарим за ответы.


person Pompair    schedule 07.08.2009    source источник


Ответы (1)


Попробуйте установить DataContext StackPanel на объект FeedData:

<StackPanel DataContext="{Binding FeedData}">

...

Это заставит StackPanel взглянуть на DependencyProperty, и все элементы в нем будут обозначаться как свойства FeedData.

Пока вы определяете DataContext как «FeedData» где-нибудь в логическом дереве над визуальными элементами, которые вы привязываете к его свойствам, он будет работать.

person Guy Starbuck    schedule 07.08.2009