2009-03-11 14 views
2

Yani bu sınıflara sahip olduğumu söyleyelim:WPF: Yinelenen nesne başvurusu olan SelectedItems

public class Person 
{ 
    public string Name { get; set; } 
} 
public class PersonCollection : ObservableCollection<Person> { } 

Ve ItemsSource öğesinin bir PersonCollection'a bağlı bir ListView olduğunu söyleyebiliriz. Şimdi bu koda sahip olduğumu söyleyelim:

public void AddPeople() 
{ 
    Person p = new Person() { Name = "Someone" }; 
    MyPersonCollection.Add(p); 
    MyPersonCollection.Add(p); 
    MyPersonCollection.Add(p); 
} 

Şimdi üç öğe içeren bir ListView'im var, bu üç öğenin de SAME nesnesine referansları var. Şimdi seçiyorum, ListView'de 0 ve 2 dizinlerine sahip öğeleri seçelim.

ListView.SelectedItems özelliği, görsel olarak seçilen öğeler her ikisi de SAME nesnesi olduğundan seçili bir öğe seçtiğimi söyleyecektir.

Görsel olarak seçilen öğeleri nasıl alabilirim, böylece öğeleri dizin 1'de kaldırarak 0 ve 2 dizinlerindeki öğeleri kaldırabilirim?

cevap

2

burada yararlı olacaktır ListBox.SelectedIndices mülkiyet vardır, ama biz maalesef ...

Sen ItemContainerGenerator.ContainerFromIndex kullanarak ListViewItem s yinelemenize olabilir

, ListViewItem.IsSelected kontrol WPF buna sahip ve sonra çıkarmayın onları endekse göre. Ancak, bu sanallaştırma ile iyi sonuç vermez, çünkü öğeden ayrılırsanız ve sanallaştırılırsa ContainerFromIndex boş döndürülebilir.

for(int ixPerson = myListView.Items.Count - 1; ixPerson >= 0; ixPerson--) 
{ 
    ListViewItem personItem = myListView.ItemContainerGenerator.ContainerFromIndex(ixPerson); 
    if (personItem.IsSelected) 
    { 
     mySourcePersonCollection.RemoveAt(ixPerson); 
    } 
} 
+0

Çalıştığınız için teşekkürler. Sanallaştırma ile ilgili ne demek istediğinizden emin değilim, ama yaptığımız basit proje ile bu bizim için yeterli olacaktır. Teşekkürler. – Nick

+0

Demek istediğim, bazen öğeler koleksiyonundaki her Kişinin sanallaştırma nedeniyle bir ListViewItemine sahip olmamasıdır. ListView'de ilk kişiyi seçerseniz, o zaman kaybolacaktır, böylece ItemContainerGenerator.ContainerFromIndex (0) çağrısının null olması mümkündür. –

-2

Sanırım modelinizde bir sorun var! Neyi başarmaya çalışıyorsanız yapın, bunu yapmanın daha sağlam bir yolunu bulmaya çalışacağım.

+0

Ne demek:

Kod şöyle görünürdü? Belki de istediğim işlevsellik budur. İş mantığımla ilgili bir sorunun varsa, beni yalnız bırakın. – Nick

1

Bu durumun mantıklı olduğu durumlar vardır; örneğin, bir kereden fazla görünmesi istenen bir sıraya insan eklenmesi gibi. Bu durumda WPF'nin zayıf şekilde tasarlandığı görülüyor. Koleksiyondaki tüm öğeler arasında manuel olarak yineleme yapmak ve seçim durumunu kontrol etmek mümkün mü? WinForms ise

+0

Şimdiye kadar böyle bir şey bulamadım, ama bu güzel olurdu. – Nick

İlgili konular