从URI xamarin表单

时间:2016-04-26 17:25:21

标签: c# image listview xamarin xamarin.forms

好的,所以我有这个listView,它应该显示一堆项目,每个项目至少包含一张照片。

这个想法是在listCell中显示主要照片,当选择一个项目时,它的详细信息显示在不同的表单页面中,并且应该能够访问它的所有照片。

当项目没有照片时,它会显示资源中的占位符。

问题:无法从URI加载图像,将图像源绑定到包含特定URI obj的list属性(来自viewModel),或者将其绑定到包含now strings的同一属性,或者通过

<Image.Source>
     <UriImageSource Uri="{Binding MainPhotoSource}" />
</Image.Source>

不管。这些似乎都不起作用。

已经向Xamarin团队寻求帮助,他们的回答是来到这里,或者去论坛(我已经做了,已经等了将近两个月了,现在,工作需要交付)......

请帮忙吗?

修改 这是ViewModel代码的一部分。

在第一种方法中,对于从WCF收到的每个项目,我将此ItemDto obj的格式添加到此ObservableCollection列表中。

// Sets this List observable collection to a new ItemDto obj,
// with certain properties from the Item.Find result[].
ObservableCollection<ItemDto> SetList(Item.Find[] result)
{
    ObservableCollection<ItemDto> collection = new ObservableCollection<ItemDto>();

    foreach (Item.Find item in result)
    {
        collection.Add(GetDto(item));
    }
    return collection;
}

// Gets a new ItemDto obj with the required fields from Item.Find obj.
ItemDto GetDto(Item.Find item)
{
    return new ItemDto()
    {
        ID = item.ID,
        UserID = item.User_ID,
        MainPhotoSource = new Uri(_serverInbox + item.MediaItems[0].RelativeUrl),
        Title = item.Title,
        Description = item.Description,
        Category = item.Category_Name,
        DateCreated = GetFormatedDateCreated(item.DateCreated)
    };
}

2 个答案:

答案 0 :(得分:3)

UriImageSource的Uri属性需要一个Uri而不是一个字符串。但是您可以在View Model中使用URI Bindable属性并绑定到它:

Check this code

  

查看模型

j>0
  

查看

public string ProductNo
{ 
    get { return _productNo}
    set
    {
        if (_productNo != value)
        {
            _productNo = value;
            RaisePropertyChanged();
            RaisePropertyChanged(() => ThumbnailImageUri);
        }
    }
}

public Uri ThumbnailImageUri
{
    get
    {
        if (_thumbnailImageUri == null)
        {
            _thumbnailImageUri = new Uri(String.Format("http://www.YOURWEBSITE.com/{0}.jpg", _productNo));
        }
        return _thumbnailImageUri;
    }            
}

答案 1 :(得分:2)

这是什么对我有用 - 希望这能帮到你

首先是我的BindingContext:

public class ItemContainer
{
    public ItemContainer()
    {           
        Collection = SetList(new[] { "1", "2", "3", "4" });
    }

    ObservableCollection<ItemDto> SetList(string[] result)
    {
        ObservableCollection<ItemDto> collection = new ObservableCollection<ItemDto>();

        foreach (string item in result)
        {
            collection.Add(GetDto(item));
        }
        return collection;
    }
    public ObservableCollection<ItemDto> Collection { get; set; }
    ItemDto GetDto(string item)
    {
        return new ItemDto() { MainPhotoSource = new Uri(_serverInbox + item) }; 
    }
}

我的Page1.xaml看起来像这样:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="App1gcm.Page1">
    <ListView ItemsSource="{Binding Collection}" VerticalOptions="Center" HorizontalOptions="Center" >
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <Image Source="{Binding MainPhotoSource}" />
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</ContentPage>

我将它们合并为在App.cs中创建MainPage:

public App()
{
    // The root page of your application
    MainPage = new Page1
    {
        BindingContext = new ItemContainer()
    };
}