Как выполнить простую привязку в Silverlight?

Я понимаю, что Silverlight 3.0 имеет привязку, но просто хочу простой пример того, как использовать это для чтения свойства из класса.
У меня есть класс под названием Appointment, который в качестве свойства String с именем Location:

    Public Property Location() As String
        Get
            Return _Location
        End Get
        Set(ByVal Value As String)
            _Location = Value
        End Set
    End Property

Конечно, с частной декларацией для _Location as String.
Я хочу, чтобы элемент XAML привязался к этому свойству, чтобы отображать его в TextElement, но он должен быть в XAML, а не в коде, например, мне нужно что-то вроде этого:

<TextBlock Text="{Binding Appointment.Location}"/> 

Что мне нужно сделать, чтобы это заработало?
Это должно быть решение Silverlight 3.0, так как некоторые функции WPF отсутствуют, например DynamicResource, к которому я привык.


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


person RoguePlanetoid    schedule 01.09.2009    source источник
comment
Похоже, ответы здесь были отличными для того, чтобы заставить это работать, это была только часть DataContext, которая заставила его работать, поскольку до сих пор не знал, как это сделать!   -  person RoguePlanetoid    schedule 01.09.2009
comment
Мне понадобится несколько DataContexts для привязки к нескольким классам, но я должен уметь это понять - объединю их в один класс для привязки к XAML   -  person RoguePlanetoid    schedule 01.09.2009


Ответы (3)


У вас есть два варианта.

Если класс «Встреча» можно использовать в качестве контекста данных для элемента управления или окна, вы можете:

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

Если, однако, «Встреча» является свойством вашего текущего DataContext, вам понадобится более сложный путь для привязки:

<TextBlock Text="{Binding Path=Appointment.Location}" />

Полная информация задокументирована в MSDN на странице объявлений привязки. Если ни один из них не работает, убедитесь, что у вас правильно установлен DataContext.

person Reed Copsey    schedule 01.09.2009
comment
Спасибо за это, по крайней мере, у меня есть кое-что, что сейчас работает, я привык к DynamicResources, но он более мощный и немного более аккуратный в моем XAML - person RoguePlanetoid; 01.09.2009

Вам нужно что-то в коде, если вы не хотите объявить экземпляр Appointment в ресурсе и привязаться к нему, но я сомневаюсь, что это то, что вы хотите.

Вам необходимо привязать свойство Text к пути к свойству «Location», а затем назначить DataContext содержащего XAML экземпляру встречи: -

<Grid x:Name="LayoutRoot" Background="White">
   <TextBlock Text="{Binding Location}" />
</Grid>

Затем в событии загрузки элемента управления: -

 void Page_Loaded(object sender, RoutedEventArgs e)
 {
    this.DataContext = new Appointment() { Location = "SomePlace" };
 }

Обратите внимание, что в этом случае я использую элемент управления Page по умолчанию.

person AnthonyWJones    schedule 01.09.2009
comment
На самом деле это заставило меня понять, что я назначаю DataContext до того, как класс будет экземпляром, если я назначу класс назначения как DataContext после загрузки моего XAML, он работает! - person RoguePlanetoid; 01.09.2009

Если я правильно читаю, вам нужно создать экземпляр Appointment, установить DataContext элемента управления для этого экземпляра и изменить привязку, чтобы просто сказать: Text = "{Binding Location}"

Кроме того, рассмотрите возможность реализации INotifyPropertyChanged в своем классе Appointment, чтобы позволить классам данных уведомлять пользовательский интерфейс об изменениях значений свойств.

person James Cadd    schedule 01.09.2009
comment
Это похоже на то, что мне нужно - как установить DataContext в XAML на экземпляр класса? - person RoguePlanetoid; 01.09.2009