【问题标题】:how to horizontal option value of listview item from view model in xamarin form如何从 xamarin 形式的视图模型中水平选项值的列表视图项
【发布时间】:2019-09-25 10:30:06
【问题描述】:

我有 listview,我需要根据 viewmodel.so 的条件设置 stacklayout 水平选项值。所以如何设置它

私有字符串水平选项;

    public string HorizontalOption
    {
        get => horizontalOption;
        set
        {
            horizontalOption = value;
            OnPropertyChanged(nameof(HorizontalOption));
        }
    }

public async Task FetchThreadUserData()
    {
     sing (HttpClient hc = new HttpClient())
        {
            try
            {
                IsBusy = true;
                var jsonString = await hc.GetStringAsync(url);
                var obj = JsonConvert.DeserializeObject<MessageList>(jsonString);
                foreach (var user in obj.messages)
                {
                    string authorIdStr = user.authorId;
                    if(authorIdStr==userId)
                    {
                        HorizontalOption = "StartAndExpand";
                    }
                    else if(authorIdStr!=userId)
                    { 
                    HorizontalOption = "EndAndExpand"; 
                    }
                    list.Add(user);
                }
            }
 and binding it like this in Xaml
<StackLayout HorizontalOptions="{Binding HorizontalOption}" >
but it is not working .

【问题讨论】:

  • 绑定前检查属性类型。

标签: forms xamarin


【解决方案1】:

如果你想让列表水平滚动,你可以在Forms中使用CollectionViewCollectionView在XF 4.0之后发布。

<CollectionView ItemsSource="{Binding xxx}">
    <CollectionView.ItemsLayout>
        <ListItemsLayout Orientation="Horizontal" />
    </CollectionView.ItemsLayout>

     <CollectionView.ItemTemplate>
        <DataTemplate>

          //...
        </DataTemplate>
    </CollectionView.ItemTemplate>

</CollectionView>

在调用 Forms.Init 之前,不要忘记将以下代码行添加到 iOS 上的 AppDelegate 类或 Android 上的 MainActivity 类中:

Forms.SetFlags("CollectionView_Experimental");

【讨论】:

  • 我想根据我上面添加的条件以编程方式设置 Horizo​​ntalOption 的值。
  • 如果你想让它水平滚动,我不建议使用listview。
【解决方案2】:

您可以简单地使用 DataTriggers 根据某些 ViewModel 属性值更改 Horizo​​ntalOptions...

如下所示更新您的属性...

public bool HorizontalOption
{
    get => horizontalOption;
    set
    {
        horizontalOption = value;
        OnPropertyChanged(nameof(HorizontalOption));
    }
}

现在更新您的 Xaml 代码,如下所示...

<StackLayout>
//Your UI Elements here
  <StackLayout.Triggers>
     <DataTrigger TargetType="StackLayout" Binding="{Binding HorizontalOption}" 
        Value="True">
        <Setter Property="HorizontalOptions" Value="StartAndExpand"/>
     </DataTrigger>
     <DataTrigger TargetType="StackLayout" Binding="{Binding HorizontalOption}" 
        Value="False">
        <Setter Property="HorizontalOptions" Value="EndAndExpand"/>
     </DataTrigger>
  </StackLayout.Triggers>
</StackLayout>

注意:- 在您的方法 FetchThreadUserData() 中将 Horizo​​ntalOption 属性值更新为 True 或 False...

希望对你有帮助

【讨论】:

  • 误导性的属性名称。
【解决方案3】:

它不起作用,因为您将字符串绑定到接受 LayoutOptions 的属性。

public Xamarin.Forms.LayoutOptions HorizontalOption
{
    get => horizontalOption;
    set
    {
        horizontalOption = value;
        OnPropertyChanged(nameof(HorizontalOption));
    }
}

【讨论】:

  • 这样设置属性 andif (authorIdStr == userId) { Horizo​​ntalOption = LayoutOptions.StartAndExpand; } else { Horizo​​ntalOption = LayoutOptions.EndAndExpand; } list.Add(user);
  • 但在 ui 端它没有根据属性值显示
猜你喜欢
  • 1970-01-01
  • 2019-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多