Xamarin формы: представление содержимого не отображается на странице содержимого - PullRequest
0 голосов
/ 29 мая 2018

Пытаюсь загрузить представление контента на странице контента.Когда я запускаю код, он не попадает в мой просмотр контента.Я назначаю два привязываемых параметра со своей страницы содержимого.

Страница содержимого:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:templates="clr-namespace:G2.Scanner.Views.Templates"           
         xmlns:viewModelBase="clr-namespace:G2.Scanner.ViewModels.Base;assembly=G2.Scanner"              
         xmlns:telerikPrimitives="clr-namespace:Telerik.XamarinForms.Primitives;assembly=Telerik.XamarinForms.Primitives"
         xmlns:local ="clr-namespace:G2.Scanner.Views.Transaction"
         x:Class="G2.Scanner.Views.Transaction.TransactionView"
         viewModelBase:ViewModelLocator.AutoWireViewModel="true">

        <local:GenerateScreen x:Name="generateScreen" ControllerName="{Binding ControllerName}" IsBusy="{Binding IsBusy}"/>

</ContentPage>

Просмотр содержимого:

public partial class GenerateScreen : ContentView
{
    #region BindableProperties
    public static readonly BindableProperty ControllerNameProperty = BindableProperty.Create("ControllerName", typeof(string), typeof(GenerateScreen));
    public static readonly BindableProperty IsBusyProperty = BindableProperty.Create("IsBusy", typeof(bool), typeof(GenerateScreen));
    #endregion

    #region Properties
    public string ControllerName
    {
        get { return (string)GetValue(ControllerNameProperty); }
        set { SetValue(ControllerNameProperty, value); }
    }

    public bool IsBusy
    {
        get { return (bool)GetValue(IsBusyProperty); }
        set { SetValue(IsBusyProperty, value); }
    }
    #endregion

    public GenerateScreen()
    {
        InitializeComponent();
        DesignScreenAsync();
    }

    public async void DesignScreenAsync()
    {
        IsBusy = true;

        // Some Design code..

        #region render
        scroll = new ScrollView
        {
            Content = layout
        };
        TransactionElements.Children.Add(scroll);
        #endregion
        IsBusy = false;
    }

Представление содержимого принимает два привязываемых свойства и используется во время загрузки.

Представление содержимого Xaml:

<?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="G2.Scanner.Views.Transaction.GenerateScreen">
  <ContentView.Content>
        <StackLayout x:Name="TransactionElements"/>
    </ContentView.Content>
</ContentView>

Я хочу, чтобы это представление отображалосьво время загрузки страницы контента.Я понял, что это работает, если я не использую привязываемые свойства в представлении содержимого.Но согласно Моему требованию ControllerName и IsBusy в классе ContentView должно быть свойством Bindable.Любая Помощь, почему это не касается этого Представления.

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Спасибо всем, что нашли время.Я действительно нашел решение для себя.

То, что на самом деле пошло не так, было в двух местах.

  1. Свойства привязки будут установлены только после инициализации класса.Так что если мы вызовем метод DesignScreenAsync в конструкторе, который принимает значение controller name, очевидно, будет иметь значение null.решение состоит в том, чтобы вызвать метод в conrollerName ProprtyChanged методе.

вот код:

public static readonly BindableProperty ControllerNameProperty = BindableProperty.Create(nameof(ControllerName), typeof(string), typeof(GenerateScreen),default(string), propertyChanged: OnControllerPropertyChange);

private static void OnControllerPropertyChange(BindableObject bindable, object oldValue, object newValue)
{
    ((GenerateScreen)bindable).DesignScreenAsync();
}

Обратите внимание, что я использовал BindableObject для вызоваметод.это вызывать метод из той же инстанции.

Причина, по которой contentView не срабатывает, состоит в том, что я не установил значение по умолчанию для bool IsBusyProperty, поэтому важно установить значение по умолчанию для свойства bindable.

вот код:

public static readonly BindableProperty IsBusyProperty = BindableProperty.Create(nameof(IsBusy), typeof(bool), typeof(GenerateScreen),default(bool), defaultBindingMode: BindingMode.TwoWay);
0 голосов
/ 29 мая 2018

Определение асинхронного пустого метода в большинстве случаев является плохой практикой.Чтобы избежать этого и, возможно, решить вашу проблему, у вас есть 2 решения в зависимости от ваших потребностей.

1) Если DesignScreen создает ваш пользовательский интерфейс только без интенсивного вызова, вы должны выполнить его синхронно:

  public GenerateScreen()
   {
    InitializeComponent();
    DesignScreenAsync();
   }

   public void DesignScreen()
   {
    IsBusy = true;

    // Some Design code..

    #region render
    scroll = new ScrollView
    {
        Content = layout
    };
    TransactionElements.Children.Add(scroll);
        #endregion
        IsBusy = false;
       }

2) Если у вас интенсивные звонки, которые нужно ждать.Выполнять интенсивные вызовы и обновлять пользовательский интерфейс с помощью Device.BeginInvokeOnMainThread:

 public async void DesignScreenAsync()
 {
     IsBusy = true;

    await ApiIntensiveCall();
    // Some Design code..

    #region render
    Device.BeginInvokeOnMainThread(() =>
    {
      scroll = new ScrollView
      {
        Content = layout
      };
      TransactionElements.Children.Add(scroll);
      #endregion
    });

    IsBusy = false;

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