2016-11-24 50 views
6

C# dosyamda ListView yapıyorum. Ama bunun yerine veri eklemek için sqlite de xaml dosyasından veri eklemek istiyorum, böylece düzeni xaml ile düzenleyebiliyorum. Dolayısıyla, sqlite'den gelen her yanıtın etiket olarak eklenmesi gerekir (<TextCell Text="{Binding Name}" />).SQLite'den tam yanıtı nasıl bağlarım?

Soruma Yanıt: Yanıtı GetCategoryByMenuID'dan TextCell Text="{Binding Name}"'a nasıl bağlarım?

xaml sayfası (CategoriePage.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="AmsterdamTheMapV3.CategoriePage"> 
    <ListView x:Name="listView"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
     <TextCell Text="{Binding Name}" /> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
    </ListView> 
</ContentPage> 

Arka uç/C# (CategoriePage.xaml.cs):

namespace AmsterdamTheMapV3 
{ 
    public partial class CategoriePage : ContentPage 
    { 

     public CategoriePage(String txt) 
     { 
      InitializeComponent(); 
      var layout = new StackLayout { Padding = new Thickness(5, 10) }; 
      int page = Int32.Parse(txt); 
      this.Content = layout; 

      var categories = App.Database.GetCategoryByMenuID(page); 

      var datatemplate = new DataTemplate(() => 
      { 
       var nameLabel = new Label(); 
       nameLabel.SetBinding(Label.TextProperty, "Name"); 
       //nameLabel.SetBinding(Label.idProperty, "Name"); 

       return new ViewCell { View = nameLabel }; 
      }); 

      var listView = new ListView 
      { 
       ItemsSource = categories, 
       ItemTemplate = datatemplate 
      }; 

      layout.Children.Add(listView); 
     } 
    } 
} 

GetCategoryPage fonksiyonu:

public List<Categories> GetCategoryByMenuID(int menuID) 
{ 
    lock (locker) 
    { 
     return db.Table<Categories>().Where(x => x.Menu_ID == menuID).ToList(); 
    } 
} 

cevap

2

Verilen (ı EntityFramework için sqliteAPI uzağa hareket ettik öncesi) En azından sqlite benim için çalıştı
<?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="AmsterdamTheMapV3.CategoriePage"> 
    <ListView x:Name="listView"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
     <ViewCell> 
      <ViewCell.View> 
      <StackLayout> 
       <Label Text="{Binding Name}" /> 
      </StackLayout> 
      </ViewCell.View> 
     </ViewCell> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
    </ListView> 
</ContentPage> 

Kodu güncelle

namespace AmsterdamTheMapV3 { 
    public partial class CategoriePage : ContentPage { 

     public CategoriePage(string txt) { 
      InitializeComponent(); 
      this.Appearing += (s,e) => { 
       if(NotInDesignMode) { 
        int page = 0; 
        if(int.TryParse(txt, out page)){ 
         var categories = App.Database.GetCategoryByMenuID(page); 
         this.listView.ItemsSource = categories; 
        } 
       } 
      }; 
     } 

     bool NotInDesignMode { 
      get { return Application.Current != null; } 
     } 
    } 
} 
+0

Çalışma kategorileri bir String değil çünkü çalışmıyor. Hata: Giriş dizesi doğru formatta değil ” –

+0

Bu hata nereye atılıyor? büyük olasılıkla 'string'' int' olarak ayrıştırmaya çalıştığınızda. Buradaki varsayım, veritabanı görünümünden döndürülen nesnelerin bir araya getirilmesiydi. Bu liste, liste görünümü için bir öğe kaynağı olarak kullanılmasına izin verdi. – Nkosi

+0

Sorun, 'var kategorileri' Bir dizi, ancak yanlış olabilir Xamarin ile bazı sorunlar sadece uygulama geliştirme ile başladı. –

1

You Çirkin ve hızlı uygulama yolu (GetCategoryByMenuID yönteminde, kategoriye göre çalışacak bir güncelleştirme adı çalıştırın. s). Ya da normal bir liste olarak dizin yerine menuID tabanlı bir koleksiyon oluşturarak.

public class CategoriesCollection<T> : KeyedCollection<int, T> 
    { 
     protected override int GetKeyForItem(T item) 
     { 
      return (item as Category).Id; 
     } 

     /// <summary> 
     /// Method to get the index into the List{} in the base collection for an item that may or may 
     /// not be in the collection. Returns -1 if not found. 
     /// </summary> 
     protected override int GetItemIndex(T itemToFind) 
     { 
      int keyToFind = GetKeyForItem(itemToFind); 
      return BaseList.FindIndex((T existingItem) => 
             GetKeyForItem(existingItem).Equals(keyToFind)); 
     } 
    } 

sql Tamam depolama/olmalıdır Eğer bir sözlük kullanamadı iken, bu çalışması gerekir, böylece ıcollection olan her şeyi almak.

+0

Yani EHM arkasında ben It alamadım çalışmak (bir colletion yapmak) bilinmeyen isimler/isim alanı hakkında birçok hatalar olsun. Bunun hakkında biraz daha açıklama yapabilir misiniz? Üzgünüz sadece C# ve Xamarin ile başladı. –

+0

Bu hatanın imgesini görüyorum imgal.com/gallery/EeGml. İlk hata, probally bir yazım hatasıydı, ben de siz buyruğu düzenledim. –

+0

Geç cevap için özür dilerim. Öncelikle https://msdn.microsoft.com/en-us/library/ms132438(v=vs.110).aspx, System.Collections.ObjectModel adını eklemeniz gerekir. İkincisi, kodumu değiştirdim - guid'i int olarak değiştirdim, bu da başka bir hatayı kaldırmalıydı. – Oyiwai

İlgili konular