Привязка данных к элементу управления

#silverlight #data-binding #binding

#silverlight #привязка данных #привязка

Вопрос:

Я использую Silverlight с MVVM.

У меня есть простая LoginControl привязка к a LoginControlViewModel . Создается LoginControl и добавляется в my MasterPage .

Когда пользователь входит в мое приложение, нажимая кнопку входа в систему LoginControl , LoginControlViewModel отправляет событие обратно в MasterPageControlViewModel . На этом этапе MasterPageControlViewModel.LoginVisible свойство имеет значение False .

Проблема, с которой я сталкиваюсь, связана с XAML MasterPageView , поскольку я не знаю, как привязать LoginControl к MasterPageControlViewModel.LoginVisible свойству. Приведенное ниже не работает.

 <Controls:Login x:Name="LoginControl" Style="{StaticResource LoginControlStyle}"
    Visibility="{Binding LoginControlVisibility, Converter={StaticResource BoolConverter}}" />
  

В окне вывода указано следующее:

Система.Windows.Ошибка данных: ошибка пути привязки выражения: свойство ‘LoginControlVisibility’ не найдено в ‘Silverlight.Элементы управления.LoginControlViewModel’ ‘Silverlight.Элементы управления.LoginControlViewModel’ (хэш-код = 43749873). Выражение привязки: Path=’LoginControlVisibility’ DataItem=’Silverlight.Элементы управления.LoginControlViewModel’ (hashCode=43749873); целевой элемент — ‘Элементы управления.Login’ (Name=’LoginControl’); целевым свойством является ‘Видимость’ (тип ‘System.Windows.Visibility’)

Есть какие-нибудь идеи, как это решить?

Ответ №1:

Ах, и я вижу, что ваше свойство находится в другой модели представления, чем то, что имеет элемент управления для его DataContext.

Что я делал в прошлом, так это помещал LoginControl в другой контейнер (скажем Border , или StackPanel ), а затем вы можете привязать Visibility эту панель к своему свойству. Таким образом, DataContext LoginControl остается LoginControlViewModel неизменным, а привязка видимости проста.

Редактировать: оказывается, приведенный ниже метод не поддерживается в Silverlight.

Или у вас может быть сложная привязка к LoginControl тому, что смотрит на его родителей DataContext :

 Visibility="{Binding Path=DataContext.LoginVisible, 
         RelativeSource={RelativeSource FindAncestor, AncestorType=MasterPage},
         Converter={StaticResource BoolConverter}}"
  

Кроме того, разве ваше свойство не называется LoginVisible не LoginControlVisibility так, как у вас в привязке? Или это была опечатка только в вопросе?

Комментарии:

1. Извините, это был тип, который должен быть LoginControlVisibility. Я думаю, чтобы решить эту проблему, мне нужно получить доступ к относительному источнику DataContext в привязке. Я читаю, что это не поддерживается в Silverlight

2. Я не уверен, поддерживается ли это в silverlight, но попробуйте. Это делает его похожим на msdn.microsoft.com/en-us/library/dd553635 (v= против 95).aspx

3. @caa хорошо. Это просто соответствовало бы моему первому предложению о привязке видимости к контейнеру.