2017-12-16 18 views
1

私はXamarin.Formsのこの動作について本当に混乱しています。私は、このページがあります。FindByNameは最初のエントリでは機能しますが、2番目のエントリではnullが返されます...?

<?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:local="clr-namespace:GW.Frontend.XF" 
      x:Class="GW.Frontend.XF.AppPage"> 
    <StackLayout x:Name="mainLayout" Padding="20,20,20,20"> 
     <Label Text="Welcome to GW" x:Name="welcomeLabel" 
       VerticalOptions="Center" HorizontalOptions="Center" /> 

     <Entry x:Name="passphraseEntry" IsPassword="true" 
       Placeholder="Input your new pass-phrase:" 
       TextChanged="OnPassphraseTextChanged" /> 
     <Entry x:Name="passphraseEntryConfirmation" IsPassword="true" 
       Placeholder="Repeat your passphrase here" 
       TextChanged="OnPassphraseTextChanged" /> 
     <Button x:Name="createButton" 
       Text="Create my accounts" IsEnabled="false" 
       HorizontalOptions="Center" 
       Clicked="OnCreateButtonClicked" /> 
    </StackLayout> 
</ContentPage> 

をそして、これはAppPage.xaml.fsのコードです:驚いたことに

namespace GW.Frontend.XF 

open System 

open Xamarin.Forms 
open Xamarin.Forms.Xaml 

type AppPage() = 
    inherit ContentPage() 
    let _ = base.LoadFromXaml(typeof<AppPage>) 
    let mainLayout = base.FindByName<StackLayout>("mainLayout") 
    let passphrase = mainLayout.FindByName<Entry>("passphraseEntry") 
    let passphraseConfirmation = mainLayout.FindByName<Entry>("passphraseEntryConfirmation") 
    let createButton = mainLayout.FindByName<Button>("createButton") 

    member this.OnCreateButtonClicked(sender: Object, args: EventArgs) = 
     () 

    member this.OnPassphraseTextChanged(sender: Object, args: EventArgs) = 
     Console.WriteLine("______________________A") 
     if (passphrase.Text.Length > 0) then 

      Console.WriteLine("______________________B") 
      if (passphraseConfirmation.Text.Length > 0) then 

       Console.WriteLine("______________________C") 
       createButton.IsEnabled <- true 

(___Bがコンソールに印刷されているので)、パスフレーズがnullではないですが、passphraseConfirmationですヌル! (したがって、NullReferenceExceptionをスローします。)これはどのようにすることができますか?私は、StackLayoutコンテナの最初の要素だけでなく、すべての場合にFindByNameが動作すると期待しています。

答えて

1

私の悪いところは、passphraseConfirmationがnullだったことです。それはそのTextプロパティでした! (明らかにXAMLに設定されておらず、ユーザがまだ何も入力していない場合は、まだnullのままになっている可能性があります)

質問を削除するのではなく、 Entryウィジェットの仕組みからの愚かな仮定。

関連する問題