Xamarin.Forms列表视图

Xamarin.Forms列表视图,xamarin.forms,Xamarin.forms,我正在制作词汇应用程序,并尝试在Xamarin.Forms列表视图中实现最喜欢的单词 请看下面的截图 现在我使用硬代码而不是MVVM 这是我的模型 namespace Mamtil.Models { public class Word { public int Id { get; set; } public string word { get; set; } public string translation { get; set

我正在制作词汇应用程序,并尝试在Xamarin.Forms列表视图中实现最喜欢的单词

请看下面的截图

现在我使用硬代码而不是MVVM 这是我的模型

namespace Mamtil.Models
{
    public class Word
    {
        public int Id { get; set; }
        public string word { get; set; }
        public string translation { get; set; }
        public string audio { get; set; }
        public bool favorite { get; set; }
        public string groupBy => translation[0].ToString().ToUpper();
    }
}
XAML

举例来说:

...
// Some thing like
if(Word.favorite)
    Image = yellow_star.png;
else
    Image = gray_star.png;
我应该在代码中还是在XAML中执行它


我希望你能清楚地描述我的问题。提前感谢

您可以将图像的
绑定到文件、Uri或资源,从而设置要显示的图像

  • FromFile-需要可在每个平台上解析的文件名或文件路径
  • FromUri-需要一个Uri对象,例如新Uri(“”)
  • FromResource-需要嵌入到应用程序或PCL中的映像文件的资源标识符,并具有生成操作:EmbeddedResource
XAML:

 <Image Source="{Binding MyImage}" />

您可以阅读有关使用图像的更多信息

您必须使用
OnPropertyChanged()
方法,以便它拾取图像Url的新值,并且您还应该设置绑定上下文

private bool _imageUrl;
public bool ImageUrl
{
    get { return _imageUrl; }
    set { _imageUrl = value; OnPropertyChanged(); }
}

并使用
BindingContext=this在构造函数中。

一篇旧文章,但这里有另一种方法。 经典的做法是使用转换器。 您的按钮XAML现在看起来像这样:

<Button x:Name="FavoriteButton" Image="{Binding favorite, Converter={x:Static converter:FavoriteButton.Instance}}" BackgroundColor="#F5F5F5" Clicked="Favorite" BorderRadius="0" WidthRequest="45" CommandParameter="{Binding .}" />
namespace Mamtil.Converter {
public class FavoriteButton : IValueConverter {
// this Instance property just means your converter only needs to get created once, I saw it in a Xamarin sample.
    public static FavoriteButton Instance = new FavoriteButton(); 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
        if (value == null) {
            // only doing this because I've had encounters where an ImageSource has taken Exception at having null returned.
            return ImageSource.FromFile("gray_star.png");
        }
        var fav = (bool)value;
        if (fav == true) { // redundant ==, but it makes it quite explicit for any future reader glancing over your code what you intend here.
            return ImageSource.FromFile("yellow_star.png");
        }
        return ImageSource.FromFile("gray_star.png");
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
        throw new NotImplementedException();
    }
}
}
转换器的外观如下所示:

<Button x:Name="FavoriteButton" Image="{Binding favorite, Converter={x:Static converter:FavoriteButton.Instance}}" BackgroundColor="#F5F5F5" Clicked="Favorite" BorderRadius="0" WidthRequest="45" CommandParameter="{Binding .}" />
namespace Mamtil.Converter {
public class FavoriteButton : IValueConverter {
// this Instance property just means your converter only needs to get created once, I saw it in a Xamarin sample.
    public static FavoriteButton Instance = new FavoriteButton(); 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
        if (value == null) {
            // only doing this because I've had encounters where an ImageSource has taken Exception at having null returned.
            return ImageSource.FromFile("gray_star.png");
        }
        var fav = (bool)value;
        if (fav == true) { // redundant ==, but it makes it quite explicit for any future reader glancing over your code what you intend here.
            return ImageSource.FromFile("yellow_star.png");
        }
        return ImageSource.FromFile("gray_star.png");
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
        throw new NotImplementedException();
    }
}
}
如果您使用的是嵌入式资源而不是本地文件,请参考Rohit于2016年8月24日在其答案中发布的链接,了解如何在转换器中使用这些资源的指导。

或转换器是解决您问题的最佳方案

<Button Image="gray_star.png">
    <Button.Triggers>
        <DataTrigger TargetType="Button" Binding="{Binding favorite}" Value="True">
            <Setter Property="Image" Value="yellow_star.png" />
        </DataTrigger>
    </Button.Triggers>
</Button>

xmlns:converter="clr-namespace:Mamtil.Converter;assembly=Interact.Client"
namespace Mamtil.Converter {
public class FavoriteButton : IValueConverter {
// this Instance property just means your converter only needs to get created once, I saw it in a Xamarin sample.
    public static FavoriteButton Instance = new FavoriteButton(); 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
        if (value == null) {
            // only doing this because I've had encounters where an ImageSource has taken Exception at having null returned.
            return ImageSource.FromFile("gray_star.png");
        }
        var fav = (bool)value;
        if (fav == true) { // redundant ==, but it makes it quite explicit for any future reader glancing over your code what you intend here.
            return ImageSource.FromFile("yellow_star.png");
        }
        return ImageSource.FromFile("gray_star.png");
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
        throw new NotImplementedException();
    }
}
}
<Button Image="gray_star.png">
    <Button.Triggers>
        <DataTrigger TargetType="Button" Binding="{Binding favorite}" Value="True">
            <Setter Property="Image" Value="yellow_star.png" />
        </DataTrigger>
    </Button.Triggers>
</Button>