#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 хорошо. Это просто соответствовало бы моему первому предложению о привязке видимости к контейнеру.