如何通过 Bindable 属性 设置 Xamarin.Forms Shell 搜索的可见性 属性?

How to set visibility property of Xamarin.Forms Shell Search through Bindable Property?

我正在为 Android 和 iOS 使用 Xamarin.Forms(版本 5.0.0.2012)Shell 应用程序。在应用程序中,我有一个概念,如果用户登录,我必须显示 Shell 搜索框 ,否则必须隐藏搜索框。我遵循标准的 MVVM 模式。

<Shell.SearchHandler>
        <helper:ProductSearchHandler Placeholder="Search by Title, ISBN, Publisher" TextColor="{StaticResource Primary}" FontSize="Micro"
                                     ShowsResults="true" SearchBoxVisibility="{Binding TopSearchVisibility}" DisplayMemberName="Name" 
                                     ItemTemplate="{StaticResource ProductSearchTemplate}" />
    </Shell.SearchHandler>

以上是在我的 ContentPage 中放置 Search 的代码。

TopSearchVisibility 是我的可绑定对象 属性,我将值绑定到它,它像往常一样继承了 BaseViewModel 的视图模型。

ProductSearchHandler 是搜索处理程序 class.

在我的视图模型中,

// Declaration with default value
public string topSearchVisibility = "Collapsible";

public string TopSearchVisibility
{
  get { return topSearchVisibility; }
  set
  {
    topSearchVisibility = value;
    OnPropertyChanged();
  }
}

从API服务调用获取用户数据后,我正在根据UserId进行显示或隐藏搜索框的过程,如下

long userID = ... from API;

if (userID > 0)
   TopSearchVisibility = "Hidden";
else
   TopSearchVisibility = "Collapsible";

页面加载后,Shell SearchHandler 的 SearchBoxVisibility 属性 始终仅绑定其默认值 Expanded。因此,页面具有 Shell 搜索的扩展视图。 Shell 搜索不采用可绑定的 属性 值。如何通过 Shell 搜索实现我的要求?

您可以使用 IValueConverter Interfacestring 转换为 SearchBoxVisibility 属性。

喜欢:

创建 SearchVisibleConvert:

public class SearchVisibleConvert : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        SearchBoxVisibility searchBoxVisibility = SearchBoxVisibility.Expanded;
        if (value !=null)
        {
            switch (value)
            {
                case "Hidden":
                    searchBoxVisibility = SearchBoxVisibility.Hidden;
                    break;
                case "Collapsible":
                    searchBoxVisibility = SearchBoxVisibility.Collapsible;
                    break;
                default:
                    searchBoxVisibility = SearchBoxVisibility.Expanded;
                    break;
            }
      
        }
        return searchBoxVisibility;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

在您的 xaml 中使用:

 ...
<ContentPage.Resources>
    <ResourceDictionary>
        <controls:SearchVisibleConvert x:Key="visibleConvert" />
    </ResourceDictionary>
</ContentPage.Resources>

<Shell.SearchHandler>
    <helper:ProductSearchHandler Placeholder="Search by Title, ISBN, Publisher" TextColor="{StaticResource Primary}" FontSize="Micro"
                                 ShowsResults="true" SearchBoxVisibility="{Binding TopSearchVisibility, Converter={StaticResource visibleConvert}}" DisplayMemberName="Name" 
                                 ItemTemplate="{StaticResource ProductSearchTemplate}" />
</Shell.SearchHandler>