DataContext, DataBinding и привязка элементов в Silverlight - PullRequest
2 голосов
/ 23 марта 2010

Я чертовски стараюсь, чтобы моя привязка данных работала правильно.У меня есть основания полагать, что то, что я пытаюсь выполнить, не может быть сделано, но мы посмотрим, какие ответы я получу.

У меня есть UserControl.Этот UserControl не содержит ничего, кроме кнопки.Теперь внутри кода у меня есть имя свойства IsBookmarked.Когда установлен IsBookmarked, запускается код, который оживляет внешний вид кнопки.Идея состоит в том, что вы нажимаете кнопку, и она визуально меняется.Мы будем называть этот UserControl элементом управления Bookmark.

Теперь у меня есть другой элемент управления, который мы назовем FormControl.Мой FormControl содержит дочерний элемент управления Bookmark.Я пытался привязать данные к своему элементу управления Bookmark, но он не работает.Вот некоторый код, чтобы помочь вам.

Это обработчик событий XAML и Loaded моего элемента управления.Как вы можете видеть, он содержит дочерний элемент, который является пользовательским элементом управления (закладка).Поэтому, как только этот элемент управления загружается, его DataContext устанавливается на новый экземпляр объекта Employee.Silverlight также устанавливает свойство DataContext моего дочернего элемента управления закладками для того же экземпляра.Я подтвердил это путем отладки.Если у моего родителя есть допустимый набор DataContext, то почему я не могу привязать к нему данные моего дочернего элемента управления (закладки)?

<UserControl ......>
    <q:Bookmark x:Name="BookMarkControl1" IsBookmarked="{Binding IsSiteBookmarked}" />
</UserControl>

public void Control_Loaded(object sender, EventArgs e)
{
    DataContext = new Employee { IsSiteBookmarked = True };

}

Это мой пользовательский элемент управления ниже.Очевидно, он содержит больше, чем это, но для удобства чтения я обрезал его до свойства, к которому я пытаюсь привязать данные.

//this is the bookmark control. I've included this control within another control, and I'm trying to databind to properties within my parents DataContext
public partial class Bookmark : UserControl
{

    bool _IsBookmarked= false;
    public bool IsBookmarked
    {
        get {return _IsBookmarked;}
        set { 
                 _IsBookmarked= value;
                 SwitchMode(value);
            }
    }

}

ОБНОВЛЕНИЕ

Получилнекоторые ошибки JavaScript, которые я должен упомянуть.Firebug сообщает об исключении AG_E_PARSER_BAD_PROPERTY_VALUE.Похоже, моя привязка данных еще не работает.

Ответы [ 4 ]

1 голос
/ 23 марта 2010

Элемент управления предоставляет свойство IsSiteBookmarked (которое, как я считаю, должно быть DependencyProperty), но элемент управления привязывается к IsBookmarked, который не отображается.Это намеренно?Вы проверяли окно вывода Visual Studio на наличие ошибок привязки?

Дополнение 1: Поскольку вы исправили опечатку в своем вопросе и добавили, что сообщается об ошибке.

Начните с устранения проблемы AG_E_PARSER_BAD_PROPERTY_VALUE.Есть ли в сообщении об ошибке номер строки и начальная позиция?Начни искать там.Одна из стратегий - начать использовать XAML до тех пор, пока не исчезнет ошибка.Это сузит код ошибки.

Запуск в режиме отладки, проверка режима на наличие ошибок привязки в окне вывода.

Возможно, вы также захотите опубликовать код класса Employee, особенно свойство IsSiteBookmarked.

1 голос
/ 23 марта 2010

Сделайте ваше свойство IsBookmarked в элементе управления Bookmark свойством зависимостей.

Я предполагаю, что Control_Loaded является частью вашего FormControl, и в этом случае я не уверен, что вы используете DataContext правильно.Лучше всего дважды это проверить.

ОБНОВЛЕНИЕ: Да, вы правильно используете DataContext.AG_E_PARSER_BAD_PROPERTY_VALUE указывает, что вам нужно сделать свойство IsBookmarked свойством зависимости, например так:

 Public Property IsBookmarked() As Boolean
    Get
        Return Me.GetValue(IsBookmarkedProperty)
    End Get
    Set(ByVal value As Boolean)
        Me.SetValue(IsBookmarkedProperty, value)
    End Set
End Property

Public Shared ReadOnly IsBookmarkedProperty As DependencyProperty = DependencyProperty.Register("IsBookmarked", GetType(Boolean), GetType(Bookmark), New PropertyMetadata(New PropertyChangedCallback(AddressOf OnIsBookmarkedPropertyChanged)))

Private Shared Sub OnIsBookmarkedPropertyChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
    Dim cntrl As Bookmark = TryCast(d, Bookmark)
    cntrl.SetIsBookmarked(e.NewValue)
End Sub

Если вам нужно только сохранить значение для последующего использования, то вам не нужно ничего делать в процедуре OnIsBookmarkedPropertyChanged, Но я все равно поместил некоторый код в качестве примера.

Удачи!

1 голос
/ 23 марта 2010

Я не помню точный порядок, в котором оценивается привязка данных (и мне лень его искать), но, насколько я помню, изначально это происходит ПЕРЕД тем, как запускается событие Loaded формы, и без создания IsBookmarked свойство свойство зависимости или, по крайней мере, использование INotifyPropertyChanged, может возникнуть проблема с установкой соответствующего текста данных. Я бы рекомендовал либо реализовать INotifyPropertyChanged, либо сделать IsBookmarked свойством зависимости. Привязка данных достаточно сложна, чтобы справиться с ситуацией в лучшем случае (см. Мою длинную злую шутку об этом здесь ), и вы просто усложните себе задачу, если не настроите вверх ваши свойства так, как он ожидает.

0 голосов
/ 23 марта 2010

Обычно при привязке данных к объекту вы захотите использовать интерфейс INotifyPropertyChanged и реализовать его так, чтобы элемент управления мог правильно аннулировать значение своего свойства.Если вы не используете INotifyPropertyChanged с Mode = TwoWay, то любой код, который изменяет IsSiteBookmarked вашего DataContext, не будет действовать.

...