Призма и шаблоны управления - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь переписать пример "SimpleThemeWithTemplateBinding", который использует ControlTemplates, с помощью Prism. Я также добавил простой

 HeaderText = "changed";

в кнопке для изменения HeaderText в ControlTemplate, и он работает, в исходном образце.

Итак, я скопировал шаблон в мой app.xaml:

<ControlTemplate x:Key="TealTemplate">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="0.1*" />
                        <RowDefinition Height="0.8*" />
                        <RowDefinition Height="0.1*" />
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="0.05*" />
                        <ColumnDefinition Width="0.95*" />
                    </Grid.ColumnDefinitions>
                    <BoxView Grid.ColumnSpan="2" Color="Teal" />
                    <Label Grid.Column="1" Text="{TemplateBinding BindingContext.HeaderText}" TextColor="White" VerticalOptions="Center" />
                    <ContentPresenter Grid.Row="1" Grid.ColumnSpan="2" />
                    <BoxView Grid.Row="2" Grid.ColumnSpan="2" Color="Teal" />
                    <Label Grid.Row="2" Grid.Column="1" Text="(c) Xamarin 2016" TextColor="White" VerticalOptions="Center" />
                </Grid>
            </ControlTemplate>

и только что изменился {TemplateBinding HeaderText} в {TemplateBinding BindingContext.HeaderText}

ВИД:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
             prism:ViewModelLocator.AutowireViewModel="True"
             x:Class="TestAppNSPrism7.Views.PrismContentPage9">
    <ContentPage.Content>
        <ContentView x:Name="contentView" Padding="0,0,0,0" ControlTemplate="{StaticResource TealTemplate}" >
            <StackLayout>
                <Label Text="Welcome to Xamarin.Forms! page1"
                       VerticalOptions="CenterAndExpand" 
                       HorizontalOptions="CenterAndExpand" />
                <Label Text="Buazz"
                       VerticalOptions="CenterAndExpand" 
                       HorizontalOptions="CenterAndExpand" />
                <Button Command="{Binding ButtonChangeValueCommand}" Text="Change value" ></Button>
            </StackLayout>
        </ContentView>
    </ContentPage.Content>
</ContentPage>

ViewModel:

public class PrismContentPage9ViewModel : ViewModelBase
        {

            ControlTemplate tealTemplate;

            private string _headerText = "test";
            public string HeaderText
            {
                get
                {               
                    return _headerText;
                }
                set { SetProperty(ref _headerText, value); }
            }      

            public PrismContentPage9ViewModel(INavigationService navigationService) : base(navigationService)
            {
                tealTemplate = (ControlTemplate)Application.Current.Resources["TealTemplate"];           
            }

            private DelegateCommand _buttonChangeValueCommand;
            public DelegateCommand ButtonChangeValueCommand =>
                _buttonChangeValueCommand ?? (_buttonChangeValueCommand = new DelegateCommand(ExecuteButtonChangeValueCommand));

            void ExecuteButtonChangeValueCommand()
            {
                HeaderText = "changed";
            }
        }

Страница загружается правильно, с помощью ControlTemplate, а HeaderText является «test». Таким образом, кажется, что связывание HeaderText с ControlTemplate работает. Но когда я установил HeaderText на «изменен», метка не обновляется. Я отладил и проверил, что после нажатия кнопки она проходит через ExecuteButtonChangeValueCommand () и SetProperty (ref _headerText, value)

Есть предложения?

Спасибо!

1 Ответ

0 голосов
/ 15 мая 2018

Я изменил TemplateBinding с:

Text="{TemplateBinding BindingContext.HeaderText}"

до:

Text="{TemplateBinding Parent.BindingContext.HeaderText}"

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

Я полагаю, что из-за того, что шаблон не имеет автоматически установленного связывающего контекста, но родительский шаблон (PrismContentPage9) имеет свой BindingContext, автоматически подключаемый из свойства Prism AutowireViewModel, например,

prism:ViewModelLocator.AutowireViewModel="True"

Дайте мне знать, если это работает для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...