Xamarin依赖性结合

时间:2017-08-01 14:50:47

标签: c# ios xamarin xamarin.ios xamarin.forms

我努力想出一些我觉得应该非常基本的东西,我希望有人可以帮助我。

我试图让自定义控件可见,具体取决于是否已向其提供数据。

例如: 我有一个使用自定义控件的主页,如下所示:

<?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:controls="clr-namespace:XamarinDependantProperty.Controls;assembly=XamarinDependantProperty"
             x:Class="XamarinDependantProperty.Pages.MainPage">
    <ContentPage.Padding>
        <OnPlatform x:TypeArguments="Thickness">
            <On Platform="iOS" Value="0,20,0,0"/>
        </OnPlatform>
    </ContentPage.Padding>
    <StackLayout>
        <Label Text="Welcome to Xamarin Forms!" VerticalOptions="Center" HorizontalOptions="Center" />
        <controls:CustomEntry TextValue="Test" VerticalOptions="Center" HorizontalOptions="Center"></controls:CustomEntry>
    </StackLayout>
</ContentPage>

自定义控件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<ContentView xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="XamarinDependantProperty.Controls.CustomEntry" IsVisible="{Binding TextIsVisible}">
    <StackLayout>
        <Label Text="{Binding TextIsVisible}"  />
        <Label Text="{Binding TextValue}"  />
    </StackLayout>
</ContentView>

背后的代码如下:

using System;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace XamarinDependantProperty.Controls
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class CustomEntry : ContentView
    {
        public CustomEntry()
        {
            InitializeComponent();

            BindingContext = this;
        }

        public string TextValue
        {
            get { return (string)GetValue(TextValueProperty); }
            set { SetValue(TextValueProperty, value); }
        }

        public static BindableProperty TextValueProperty = BindableProperty.Create(nameof(TextValue), typeof(string), typeof(CustomEntry));

        public bool TextIsVisible => !String.IsNullOrEmpty(TextValue);
    }
}

如果我将CustomEntry的TextValue设置为&#34; Test&#34;输出是:

  

欢迎使用Xamarin Forms!

     

     

测试

如果我输入一个空字符串,则根本没有输出,应用程序启动但没有显示任何内容。

如果我将TextValueProperty的默认值设置为null,则输出为:

  

欢迎使用Xamarin Forms!

从输出看来,当我设置TextValue时,TextIsVisible值在第一个绑定(IsVisible)中工作,即使第二个绑定(Text)输出False,但为什么它为false?

如果我没有提供价值而且我没有告诉它null是可接受的空值,那么它完全搞砸了,但它并没有对此说些什么。没有错误,没有输出,没有。有没有办法看出出了什么问题? (在iphone模拟器上测试)

然后,如果我从这个测试情况中取出这个概念并将其置于真实情况中。然后设置TextValue并输出TextIsVisible仍然是假的,但它没有显示。

我做错了什么?我不理解的是什么?

1 个答案:

答案 0 :(得分:2)

您需要为TextIsVisible举起 propertychanged 事件,以通知View 属性已更改

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class CustomEntry : ContentView
{
    public CustomEntry()
    {
        InitializeComponent();

        BindingContext = this;
    }

    public string TextValue
    {
        get { return (string)GetValue(TextValueProperty); }
        set{SetValue(TextValueProperty, value);OnPropertyChanged(nameof(TextIsVisible));}
    }

    public static BindableProperty TextValueProperty = BindableProperty.Create(nameof(TextValue), typeof(string), typeof(CustomEntry),propertyChanged:OnTextChanged);

    private static void OnTextChanged(BindableObject bindable, object oldvalue, object newvalue)
    {
        var entry = bindable as CustomEntry;
        entry?.OnPropertyChanged(nameof(TextIsVisible));
    }

    public bool TextIsVisible => !String.IsNullOrEmpty(TextValue);
}