2011-10-10 14 views
10

Kullanıcının bir Transaction nesnesini düzenleyebileceği veya silebileceği Windows Phone 7 uygulamasında bir sayfam var. Transaction nesnesi, hesap sınıfı ve kategori sınıfı ile ilişkisi olan bir Linq-to-Sql sınıfıdır. sayfasında, böyle, kullanıcı verilen işlem için hesap ve kategori seçin bildirmek için bir ListPicker kullanın:Liste ayırıcı hatası SelectedItem her zaman geçerli bir değere ayarlanmalıdır

<toolkit:ListPicker Grid.Row="1" FullModeHeader="Choose the Account" FullModeItemTemplate="{StaticResource FullModeItemTemplate}" ExpansionMode="FullScreenOnly" Background="#26000000" Margin="10,0,10,0" Name="Account" SelectedItem="{Binding Account, Mode=TwoWay}" Tap="ListPicker_Tap" /> 

<toolkit:ListPicker Grid.Row="7" FullModeHeader="Choose the Category" FullModeItemTemplate="{StaticResource FullModeItemTemplate}" ExpansionMode="FullScreenOnly" Background="#26000000" Margin="10,0,10,0" Name="Category" SelectedItem="{Binding Category, Mode=TwoWay}" Tap="ListPicker_Tap" /> 

ListPicker_Tap olay WPF Ağustos/2011 sürümünde bir hata için bir düzeltmedir Windows Phone için ve Toolkit basitçe şudur:

private void ListPicker_Tap(object sender, System.Windows.Input.GestureEventArgs e) 
    { 
     ListPicker lp = (ListPicker)sender; 
     lp.Open(); 
    } 

Eğer kullanıcı düzenlemesi işlem, her şey iyi, ama kullanıcı bunu silmeye çalışırsanız, ben SelectedItem hep ayarlanması gerekir" belirten bir hata olsun geçerli değer". İşte

kod ise TransactionPage.xaml.cs içinde AppBar içinde silme düğmesi kullanıcı tıklama:

private void appBarDelete_Click(object sender, EventArgs e) 
    { 
     MessageBoxResult result = MessageBox.Show("Are you sure?\n", "Confirm", MessageBoxButton.OKCancel); 

     if (result == MessageBoxResult.OK) 
     { 
      App.ViewModel.DeleteTransaction(transaction); 
     } 

     NavigationService.GoBack(); 
    } 

Benim ViewModel.DeleteTransaction yöntemi:

public void DeleteTransaction(Transaction transaction) 
    { 
     AllTransactions.Remove(transaction); 
     transactionRepository.Delete(transaction); 
    } 

My transactionRepository.Delete yöntemi:

public void Delete(Transaction transaction) 
    { 
     Context.Transactions.DeleteOnSubmit(transaction); 
     Context.SubmitChanges(); 
    } 

Bu hataya Context.SubmitChanges dosyasında ulaşıyorum() Yürütme, İşlem sınıf içinde NotifyPropertyChanged, ben hata alıyorum hattına ayıklama noktaları şudur: ÖzellikAdı yılında

protected virtual void SendPropertyChanged(String propertyName) 
    { 
     if ((this.PropertyChanged != null)) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

değer "Kategori" dir bağlıyoruz. Nesne silinirken, kategori ve hesapların propertychanged olayını göndermek gibi görünüyor ve listpicker TwoWay modunda olduğundan, onunla uğraşırken bazı sorunları var. Bunu nasıl düzeltebilirim? Biraz yardıma ihtiyacım var.

+0

tam XAML takmak Can yardımcı Umut? Ya da çok uzunsa, kısmi XAML, 'Binding Account, Mode = TwoWay}' ve '{Binding Category, Mode = TwoWay}' ın ne olduğunu görebildiğimiz sürece iyi olur. – Amry

cevap

1

sorun ListPicker türe Transaction bir nesneye bağlanma ediyoruz oysa bir ListPickerItem olmak SelectedItem bekliyor olmasıdır. Bunun yerine SelectedIndex özelliğine bağlayarak sorunu giderebilir ve ardından dizine göre ViewModel öğesinden uygun nesneyi seçebilirsiniz. Eğer tanımlanan Tap işleyicisi var nedeni bir ScrollViewer içinde yer aldığında ListPicker açılmaz hata ise Ayrıca

, patch ID 10247 bakabilirsiniz. Araç takımını bu yama ile yeniden derlerseniz, sorunu giderir.) Emin ItemSource yüklenir olun: SelectedItem ItemSource sonra görünmesi gerekiyorsa nitelikler konularda al (Programlı.

+0

'ListPicker.SelectedItem', yalnızca' ListPickerItem' değil, veri nesnesine de bağlanabilir. – Amry

+0

@Amry Bunu yapmayı denediniz mi? Ben tam olarak aynı sorunu vardı ve 'SelectedIndex' – Praetorian

+0

kullanarak çalışmak zorunda kaldı, 'ListPicker' databound ise, 'SelectedItem 'ile bir veri nesnesi kullanmak iyi çalışıyor. Belki de vakanın için yeni bir soru açabilirsin. :) – Amry

2

SelectedItem üzerinde InvalidOperationException atar sadece iki kontroller vardır

  1. Listpicker Öğeler (Bildirimsel null
  2. Listpicker seçilen öğeyi ayarlamak için Ürünlerine İlişkin indexOf geçerlidir. Yani gerekirse geçersiz emin Eşittir olun. l üzerindeki bir saatle

Hata Ayıklama istpicker.Öğeler ve geçersiz yöntem bize konuyu tanımamıza yardımcı olacak Eşittir

+0

Ayrıca, bir alt özelliğe bağlanıyorsanız, onu da başlatmanız gerekir, aksi takdirde aynı hatayı (ilk mülkünüz boş olduğundan) çalıştırırsınız. – kamranicus

12

Bu hata XAML özelliklerinin emriyle sebep olabilir: SelectedItem ayarlandığında ItemsSource null olduğu için

Bu (değil iş istisna atar):

ItemsSource ilk başlatılır gibi bu işleri
<toolkit:ListPicker DisplayMemberPath="Title" SelectionMode="Single" 
SelectedItem="{Binding SelectedCategory, Mode=TwoWay}" 
ItemsSource="{Binding Categories}" /> 

:

<toolkit:ListPicker DisplayMemberPath="Title" SelectionMode="Single" 
ItemsSource="{Binding Categories}" 
SelectedItem="{Binding SelectedCategory, Mode=TwoWay}" /> 
+1

Evet, bu, .NET kontrolündeki bir hatadır, çünkü bu senaryolar çökmeden işlenmelidir ... (bu soruna dikkat ederek kendi kontrollerinizi tasarlayın :) –

+0

Bu çözüm benim için yaptı. –

3

ListPicker i almak için Items.IndexOf kullanır Seçmesi gereken öğe örneğinin ndex'i.

Örnek eşleşmiyorsa (koleksiyondan bir nesne örneği değil), IndexOf -1 değerini döndürür ve InvalidOperationException şu iletiyle birlikte atılır: "SelectedItem her zaman geçerli bir değere ayarlanmalıdır".

Geçersiz kılma Koleksiyondaki öğe türünün yöntemine eşittir ve beklendiği gibi çalışır.

Örnek:

public override bool Equals(object obj) 
{ 
     var target = obj as ThisType; 
     if (target == null) 
      return false; 

     if (this.ID == target.ID) 
      return true; 

     return false; 
} 

o

İlgili konular