我努力想出一些我觉得应该非常基本的东西,我希望有人可以帮助我。
我试图让自定义控件可见,具体取决于是否已向其提供数据。
例如: 我有一个使用自定义控件的主页,如下所示:
<?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仍然是假的,但它没有显示。
我做错了什么?我不理解的是什么?
答案 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);
}