#xamarin.forms #freshmvvm
#xamarin.forms #freshmvvm
Вопрос:
У меня есть мобильное приложение с Xamarin.Формы и FreshMvvm. Каждая страница использует шаблон элемента управления, определенный в App.xaml:
<ControlTemplate x:Key="MainPageTemplate">
<Grid BindingContext="{Binding Source={RelativeSource TemplatedParent}}">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="9*" />
</Grid.RowDefinitions>
<Image Source="{local:ImageResource MyApp.Images.My_logo.jpg}" Margin="0, 0, 0, 5" Grid.Row="0" />
<Label Text="{Binding ScreenName}" FontSize="Subtitle" TextColor="Black" FontAttributes="Bold" HorizontalOptions="Center" Grid.Row="1" />
<Label Text="{Binding ErrorMessage}" TextColor="Red" Grid.Row="2" />
<ContentPresenter Margin="10, 0, 10, 10" Grid.Row="3" />
</Grid>
</ControlTemplate>
Свойство ScreenName определяется в PageModel следующим образом:
protected string _screenName;
public string ScreenName => _screenName;
По какой-то причине имя экрана не отображается на странице, использующей шаблон элемента управления. Это произойдет, если я заменю привязку жестко запрограммированным текстом:
<Label Text="Something" ...
Комментарии:
1. Если это свойство не установлено в конструкторе вашей модели представления, вам нужно будет реализовать INotifyPropertyChanged и сообщить пользовательскому интерфейсу, что свойство обновлено.
2. @TaylorD Спасибо за ваш комментарий. Я инициализировал свойство в конструкторе, но это не помогло…
3. Следующая мысль заключается в том, что вы устанавливаете контекст привязки к своей странице, а не к ViewModel, поэтому попробуйте
BindingContext.ScreenName
вместо этого выполнить привязку.4. @TaylorD Да! Вот и все! Не могли бы вы, пожалуйста, дать свой ответ, и я отмечу его как таковой. Большое вам спасибо!
5. Обратите внимание, что мы предпочитаем технический стиль написания здесь. Мы мягко не поощряем приветствия, надеюсь, что вы сможете помочь, спасибо, заранее благодарим, благодарственные записки, пожелания, добрые пожелания, подписи, пожалуйста, помогите, болтливые материалы и сокращенные txtspk, просьбы, как долго вы застряли, советы для голосования, мета-комментарии и т. Д. Просто объясните свою проблему и покажите, что вы пробовали, чего ожидали и что на самом деле произошло.
Ответ №1:
При настройке вашего BindingContext
на ваш {RelativeSource TemplatedParent}
контекст привязки — это страница.
Чтобы получить доступ к вашей ViewModel, вы должны изменить свой xaml, чтобы получить доступ к вашему свойству через «BindingContext» вашей страницы.
<Label Text="{Binding BindingContext.ScreenName}" FontSize="Subtitle" TextColor="Black" FontAttributes="Bold" HorizontalOptions="Center" Grid.Row="1" />
Комментарии:
1. Большое вам спасибо!
2. Рад, что смог помочь!