我必须为 GridViewItem
样式使用图像,每个 GridViewItem
表示一个保存在sqlite数据库中的对象,当我将新对象保存到db中时,我必须从compobox中选择哪个图像它用。
这是组合的定义:
<ComboBox x:Name="UriImage" Width="200" RelativePanel.Below="ActiveToggle">
<ComboBoxItem Content="Element1" x:Name="element1" IsSelected="True"/>
<ComboBoxItem Content="Element2" x:Name="element2"/>
<ComboBoxItem Content="Element3" x:Name="element3"/>
</ComboBox>
然后,我创建了此功能以匹配图像的相应URI与每个CommoboxItem
string ImageUriString="";
if (UriImage.SelectedValuePath == "Element1")
ImageUriString = "ms-appx:///Assets/Orchid_2_FF.png";
else if (UriImage.SelectedValuePath == "Element2")
ImageUriString = "ms-appx:///Assets/sapphire_orchid_FF.png";
else if (UriImage.SelectedValuePath == "Element3")
ImageUriString = "ms-appx:///Assets/yellow-cowslip-orchid_FF.png";
Uri UriString = new Uri(ImageUriString, UriKind.RelativeOrAbsolute);
然后我将Uri
字段添加到表示对象的类当我尝试保存新对象时,我有一个错误: Don't know how to read System.Uri
要在GridView中加载对象,我使用此信息:
private async void ReadAllSystemList_Loaded(object sender, RoutedEventArgs e)
{
ReadAllSystemsList dbSystems = new ReadAllSystemsList();
DB_FFSystems = await dbSystems.GetAllFFSystems(); //get all DB Systems
listBoxObj.ItemsSource = DB_FFSystems.OrderByDescending(i => i.ID).ToList();
}
和XAML的数据绑定。
<Image Width="350" Height="200" x:Name="ElementImage" Source="{Binding ImageUri}">
我考虑将URI保存为字符串,但是加载GridView时如何将字符串转换为URI?
sqlite无法存储和解析uris,因此这是您遇到的错误的来源。
您可以在数据库中安全地存储string
而不是Uri
。通常,理想的方法是拥有一个简单的类,该类用作数据库模型(具有string
属性(,然后是在演示层中使用的另一个类,然后将具有Uri
。这样,您可以很好地分离图层,并且可以在不受数据库限制的演示层上具有更实用的接口。您甚至可以使用诸如Automapper
之类的库轻松从一种类型转换为另一种类型,而不必按属性进行属性。
但是,如果您不想处理此问题,还有其他选择。首先 - 与Image
的Source
结合时,您不必将string
转换为Uri
。从string
到XAML中内置的Uri
的隐式类型转换,因此应按预期工作。
另外,您可以通过创建从IValueConverter
派生的类来实现转换器。这应该覆盖Convert
方法,并从string
中传递的实例构建Uri
实例。然后,您将转换器注册为x:Key
的资源,并在代码中使用它:
Source="{Binding ImageUri, Converter={StaticResource StringToUriConverter}"