我有一个Xamarin.Forms应用程序(顺便说一下,我是Xamarin的新手)。我在页面上有很多元素。我想根据视图模型中的属性值设置按钮的颜色。我有一个自定义的IValueConverter类,可以根据整数值将整数值转换为不同的颜色对象。
我不太清楚如何让这个工作。我正在使用Brian Lagunas的prism nuget包和模板。这是我的示例代码作为图像。
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
prism:ViewModelLocator.AutowireViewModel="True"
x:Class="PlayAlongJ.Views.MainPage"
xmlns:converters="clr-namespace:PlayAlongJ.Converters;assembly=PlayAlongJ"
Title="Play-along with J">
<ContentPage.Resources>
<ResourceDictionary>
<converters:IntToColorConverter x:Name="intToColor"/>
</ResourceDictionary>
</ContentPage.Resources>
<ContentPage.Content>
<StackLayout Margin="15,30">
<StackLayout HorizontalOptions="End" Orientation="Horizontal">
<Label Text="Chest Total" VerticalTextAlignment="Center"/>
<Button x:Name="ChestTotal" Text="{Binding ChestAmount}"
BackgroundColor="Blue"
TextColor="White" WidthRequest="150"></Button>
</StackLayout>
</StackLayout>
</ContentPage.Content>
我面临的第一个问题是,在我的页面资源字典部分,我无法获得我尝试使用的任何资源的x:Key属性。我只得到一个x:Name属性。例如,如果我想用语法设置Style资源,我只得到x:Name,而不是x:Key。我也在尝试使用我的值转换器。当我使用它时,我再次得到x:Name,而不是x:Key。如果我选择在字典资源中使用x:Name,我会收到一个编译错误,说资源需要一个x:Key,显然我无法使用它,因为它不可用。
这是我的IValueConverter实现。有人可以告诉我如何正确设置资源和我的转换器?我更喜欢在XAML中而不是在代码中设置它们。此外,一旦我可以在没有编译错误的情况下设置资源,可以使用示例代码行将我的按钮的BackgroundColor设置为viewmodel中的绑定整数属性。如果整数是负数,我想使用红色,否则,使用值转换器使用其他颜色。
public class IntToColorConverter : IValueConverter
{
public Object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return System.Convert.ToInt32(value) >= 0 ? Color.Blue : Color.Red;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
非常感谢任何帮助。感谢。
答案 0 :(得分:2)
您应该使用x:Key
属性,就像错误消息告诉您的那样。这是XAML文件中的IntelliSense无法显示所有可能选项的情况之一。如果它没有显示,并不意味着当您使用XAML时它不可用。
请查看the Xamarin documentation on Resource Dictionaries以获取有关如何在资源上使用x:Key
属性的完整说明。关于你的问题,该文章中最重要的部分是:
每个资源都有一个使用x:Key属性指定的键,它在ResourceDictionary中为它提供了一个描述性键。
然后,您可以通过StaticResource
标记扩展程序使用您的转换器(查看BackgroundColor
属性的内容):
<Button x:Name="ChestTotal" Text="{Binding ChestAmount}"
BackgroundColor="{Binding ChestAmount, Converter={StaticResource intToColor}}"
TextColor="White" WidthRequest="150"></Button>
答案 1 :(得分:1)
无论它告诉你什么,你应该使用x:Key
,如下所示:
<ResourceDictionary>
<converters:IntToColorConverter x:Key="intToColor"/>
</ResourceDictionary>
IntelliSense有时可能会失败。为确保您的XAML有序,您可以查看XAML Compilation。
然后它应该以{{1}}的形式提供,您可以在按钮中使用它,如下所示:
StaticResource
另请按照this link与Xamarin文档进行更广泛的解释。