UWP -C#:将URI保存到SQLite中,或者在加载GridView时如何将字符串转换为URI



我必须为 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之类的库轻松从一种类型转换为另一种类型,而不必按属性进行属性。

但是,如果您不想处理此问题,还有其他选择。首先 - 与ImageSource结合时,您不必将string转换为Uri。从string到XAML中内置的Uri的隐式类型转换,因此应按预期工作。

另外,您可以通过创建从IValueConverter派生的类来实现转换器。这应该覆盖Convert方法,并从string中传递的实例构建Uri实例。然后,您将转换器注册为x:Key的资源,并在代码中使用它:

Source="{Binding ImageUri, Converter={StaticResource StringToUriConverter}"

最新更新