使用 mvvm 在 xamarin 上绑定数据收集

用户6682021

所以我开始学习 xamarin 并尝试从视图到模型的不同数据绑定方法。我正在使用发布请求从服务中检索数据,在获得数据后,我无法将它们绑定到视图。经过大量研究,我找到了一些有趣的解决方案,并尝试了不同的方法。这是我迄今为止所取得的成就:我的观点:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="Ideas.Pages.IdeasSinglePage"
         xmlns:vm="clr-namespace:Ideas.ViewModel;assembly=Ideas"
          Title="My idea">

<ContentPage.BindingContext>
    <vm:IdeasViewModel/>
</ContentPage.BindingContext>

<StackLayout>
    <Button Command="{Binding GetIdeasCommand}"
            Text="Bileta Ime"
            TextColor="White"
            FontSize="15"
            BackgroundColor="#29abe2"/>
    <Label Text="test"></Label>

    <ListView ItemsSource="{Binding Ideas}"
              HasUnevenRows="True">

        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <StackLayout Padding="20, 10">
                        <Label  Text="{Binding IdeasName}"
                                 FontSize="16"
                               TextColor="RoyalBlue"/>

                    </StackLayout>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

</StackLayout>

这是我的视图模型

public class IdeasViewModel : INotifyPropertyChanged
{
    ApiServices _apiServices = new ApiServices();
    public List<Ideas> Ideas
    {
        get { return Ideas; }
        set
        {
            Ideas= value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public ICommand GetIdeasCommand
    {
        get
        {
            return new Command(async () =>
            {
                Ideas= await _apiServices.GetIdeasAsync();
            });
        }
    }


    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

}

这是我的服务:

public async Task<List<Ideas>> GetIdeasAsync()
    {
        ListIdeasDetails ideas= null;
        try { 
            var client = new HttpClient();
            client.DefaultRequestHeaders.Add("parameter", "parameter");
            client.DefaultRequestHeaders.Add("parameter", parameter);

            HttpContent content = new StringContent("");
            content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

            var response = await client.PostAsync("https://heregoes/themethod", content);
            response.EnsureSuccessStatusCode();
            string json = await response.Content.ReadAsStringAsync();
            ideas= JsonConvert.DeserializeObject<ListIdeasDetails>(json);
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message.ToString());
        }
        return ideas.Ideas;
    }
}

这是我的两个模型:

public class Ideas
{

    public string IdeasID  { get; set; }

    public string IdeasName  { get; set; }
 }


class ListIdeasDetails
{
    public List<Ideas> Ideas{ get; set; }
    public string ExceptionMessage { get; set; }
    public bool HasException { get; set; }

}

我真的很感激一些帮助!谢谢!!

EVZ

似乎您的属性定义有问题

 public List<Ideas> Ideas
 {
    get { return Ideas; }
    set
    {
        Ideas= value; // Endless loop
        OnPropertyChanged();
    }
 }

以这种方式添加支持字段:

List<Ideas> _ideas;
public List<Ideas> Ideas
{
    get { return _ideas; }
    set
    {
        if(value == _ideas) return;
        _ideas = value;
        OnPropertyChanged();
    }
}

我建议使用Fody.PropertyChanged以减少与 INotifyPropertyChanged 相关的样板代码量。使用 Fody,您的 ViewModel 看起来很简单:

public class IdeasViewModel : INotifyPropertyChanged
{
    ApiServices _apiServices = new ApiServices();
    public List<Ideas> Ideas { get;set; }

    public event PropertyChangedEventHandler PropertyChanged;

    public ICommand GetIdeasCommand
    {
        get
        {
            return new Command(async () =>
            {
                Ideas= await _apiServices.GetIdeasAsync();
            });
        }
    }
}

PS:除了您的主要问题之外,我想指出您的代码中看起来不太好的接下来的事情。

  1. 使用POST从WEB下载数据。
  2. 类名“ApiServices”。

如果您需要进一步的帮助,可以通过评论告诉我。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用 MVVM Xamarin Forms 用数据填充 Picker

来自分类Dev

使用MVVM在Xamarin中的Android GPS定位

来自分类Dev

Xamarin:应该使用MVVM库,哪个最好

来自分类Dev

锁定数据绑定MVVM

来自分类Dev

如何使用自定义模板绑定数据收集

来自分类Dev

使用MVVM绑定嵌套列表

来自分类Dev

使用MVVM绑定ComboBox SelectedItem

来自分类Dev

为什么在Xamarin.Forms中使用MvvmLight取代Mvvm?

来自分类Dev

如何使用Fresh MVVM创建Xamarin形式的Carousel页面?

来自分类Dev

Xamarin MVVM按钮绑定到命令不起作用

来自分类Dev

带有xamarin的MVVM Light绑定到ListView

来自分类Dev

Xamarin MVVM交叉替代

来自分类Dev

Xamarin MVVM 将数据传递到其他视图

来自分类Dev

使用MVVM在MainWindow上绑定UserControl视图模型

来自分类Dev

如何使用mvvm绑定网格以在其上呈现UI元素

来自分类Dev

使用MVVM ViewModel的WPF用户控件数据绑定

来自分类Dev

使用MVVM WPF进行数据网格绑定

来自分类Dev

如何使用MVVM模式在WPF数据网格中绑定CurrentCell

来自分类Dev

Kendo MVVM-使用数据显示来绑定布局

来自分类Dev

在Kotlin中使用MVVM实现双向数据绑定WebView

来自分类Dev

使用数据绑定从ViewModel显示/隐藏ProgessBar-MVVM

来自分类Dev

使用MVVM和数据绑定进行输入验证

来自分类Dev

如何获得数据绑定以使用简单的MVVM结构

来自分类Dev

使用MVVM在WPF中绑定失败

来自分类Dev

使用MVVM抛出异常绑定菜单

来自分类Dev

使用TabControl和MVVM时绑定丢失

来自分类Dev

使用MVVM在ListBox中进行绑定

来自分类Dev

如何使用MVVM模式绑定Datagrid?

来自分类Dev

使用MVVM在ListBox中进行绑定