控制模板绑定在MVVM Cross Xamarin表单中不起作用

问题描述

我当前正在使用MVVMCross进行Xamarin Forms项目。在App.xaml中,我创建了如下控件模板

response = get(url_user,headers=headers)
jsondata = response.json()

现在我正在contentPage中按如下方式使用此控件模板

   <ControlTemplate x:Key="ContentPageTemplate">
            <Grid HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" RowSpacing="0" RowDeFinitions="Auto,Auto,*">

                <!--StackLayout as Header-->
                <StackLayout Grid.Row="0" HeightRequest="6" BackgroundColor="{StaticResource SecondaryBrandColor}"></StackLayout>
               <Frame Padding="0" Grid.Row="1" >
                <Label Grid.Row="1" Text="Server Not Available" BindingContext="{TemplateBinding BindingContext}"
                       Style="{StaticResource ServerAvailableLabel}"
                       IsVisible="{TemplateBinding Parent.BindingContext.IsServerAvailableLabelVisible}"/>
                </Frame>
                <!--Content Page Body-->
                <ContentPresenter Grid.Row="2" BackgroundColor="{StaticResource PrimaryBodyColor}">

                </ContentPresenter>
            </Grid>

        </ControlTemplate>

在视图模型中,我试图使标签可见和不可见,如下所示

<views:MvxContentPage  xmlns:views="clr-namespace:MvvmCross.Forms.Views;assembly=MvvmCross.Forms"
                       xmlns="http://xamarin.com/schemas/2014/forms"
                       xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                       x:Class="Project.UI.Views.ReqView"
                       ControlTemplate="{StaticResource ContentPageTemplate}"
                       Title="Reqs">
</views:MvxContentPage>

我现在面临的问题是,认情况下标签是可见的,即使我将值设置为false也不更新。

我想念什么?

解决方法

我有完全一样的问题! 一天后,我发现了以下对我有用的解决方案。

我将BindingContext="{TemplateBinding BindingContext.DataContext}"添加到了网格中,并通过IsVisible更改了IsVisible="{Binding IsServerAvailableLabelVisible}"属性

这里是您可以尝试的总结,希望它也对您有用! 有关信息,请使用Xamarin.Forms 4.8.0MvvmCross 6.3.1

  <ControlTemplate x:Key="ContentPageTemplate">
        <Grid HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" RowSpacing="0" RowDefinitions="Auto,Auto,*"
              BindingContext="{TemplateBinding BindingContext.DataContext}">

            <!--StackLayout as Header-->
            <StackLayout Grid.Row="0" HeightRequest="6" BackgroundColor="{StaticResource SecondaryBrandColor}"></StackLayout>
           <Frame Padding="0" Grid.Row="1" >
            <Label Grid.Row="1" Text="Server Not Available"
                   Style="{StaticResource ServerAvailableLabel}"
                   IsVisible="{Binding IsServerAvailableLabelVisible}"/>
            </Frame>
            <!--Content Page Body-->
            <ContentPresenter Grid.Row="2" BackgroundColor="{StaticResource PrimaryBodyColor}">

            </ContentPresenter>
        </Grid>

    </ControlTemplate>
,

您确定更改值时会触发OnPropertyChanged事件吗?

如果是,那么您需要检查视图的绑定上下文

如果没有,则需要手动将其触发(如MVVMCross documentation中所述)

private string _myProperty;
public string MyProperty
{
    get => _myProperty;
    set
    {
        _myProperty = value;
        RaisePropertyChanged(() => MyProperty);
        // take any additional actions here which are required when MyProperty is updated
    }
}