Selectarea casetei de selectare WPFChanged

În prezent, am o Entitate care are o proprietate de colecție pe ea. Vreau să știu dacă motivul SelectionChanged ar declanșa o singură dată și nu va declanșa selecția SelectionChanged din nou după ce încerc să selectez elementul selectat anterior.

MainWindowViewModel

  public MainWindowViewModel()
    {
        var a = new List();

        a.Add(new Test() { Name = "Leo", Test1 = new List { new Test1() { Content = "aaa"} } });
        a.Add(new Test() { Name = "2", Test1 = new List { new Test1() { Content = "bbb"} } });
        a.Add(new Test() { Name = "Le33o", Test1 = new List { new Test1() { Content = "ccc"} } });
        A = a;
    }

    private List _a;
    public List A
    {
        get { return _a; }
        set { _a = value; OnPropertyChanged("A");}
    }

    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;

My Mainwindow

public MainWindow()
        {
            InitializeComponent();
            this.DataContext = new MainWindowViewModel();
        }
        private void Test(object sender, SelectionChangedEventArgs e)
        {
        }

My listbox structure

public class Test
{
    public List Test1 { get; set; }
    public string Name
    {
        get;set;
    }
}

public class Test1
{
    public string Content { get; set; }
}

Selectez primul obiect, evenimentul se declanșează, selectez cel de-al doilea obiect, evenimentul se declanșează, selectez primul obiect, evenimentul nu se declanșează, selectez al treilea obiect, evenimentul se declanșează. Se pare că declanșează și cheamă evenimentul o singură dată.

Codul meu XAML :


        
            
                
                    

                    
                        
                            
                                
                                    
                                
                            
                        
                    
                
            
        
    

Metoda de testare este doar o metodă goală Vreau doar să lovesc punctul de întrerupere de fiecare dată când mă schimb.

  private void Test(object sender, SelectionChangedEventArgs e)
    {
    }

Update 1: I tried to reproduce this in a simple wpf app, it seems that the ListBoxItem is getting IsEnabled to false but I snooped it and all the controls are enabled. It just getting a grey background that looks like disabled. Will try to investigate further.

Update 2: It seems that the ListBoxItem IsSelected property is not being unset when you change an item.

0
Ți-a dat structura Entității, de aceea am codul C# acolo, xaml-ul este modul în care o legez. Se declanșează bine și am încercat să o reproduc cu entități diferite și se comportă la fel.
adăugat autor 123 456 789 0, sursa
Da, nu trebuie să pun metoda pentru Test deoarece este doar o metodă goală Vreau doar să-l trag. Am pus un punct de întrerupere.
adăugat autor 123 456 789 0, sursa
@DisplayNameismissing Știu că acesta este un post foarte vechi, dar nu se potrivește răspunsul meu întrebarea ta?
adăugat autor WiiMaxx, sursa
Nu înțeleg cum codul C# este legat de XAML. S-ar putea să fiți mai precis.
adăugat autor JohnB, sursa
Ar trebui să postați codul metodei "Test". Am greu să cred că această metodă nu se execută în circumstanțele pe care le descrieți. Este posibil să nu obțineți rezultatele pe care le așteptați, dar acest lucru ar putea fi din cauza unui defect în logica metodei. Ați încercat să puneți un breakpoint în "Test"?
adăugat autor Lee O., sursa

3 răspunsuri

Selectarea aceluiași element nu este un eveniment SelectionChanged. Selecția nu sa schimbat.

Declarația de problemă nu este clară.

Îndepărtează-l. Aceasta funcționează pentru mine. Dacă selectăm un element a doua oară, a treia, a patra oară evenimentul se declanșează.

OP a afirmat că nu funcționează dacă este o listă într-o listă. Încă lucrează pentru mine.

    public MainWindow()
        {
            this.DataContext = this;
            InitializeComponent();
        }

        public List ListList1 
        {
            get { return new List{new ListList("name1", new List { "one", "two", "three" })}; } 
        }

        private void Test(object sender, SelectionChangedEventArgs e)
        {
            ListBox lb = (ListBox)sender;
            System.Diagnostics.Debug.WriteLine(lb.SelectedItem.ToString());
        }

        public class ListList
        {
            public string Name { get;  set; }
            public List Values { get;  set; }
            public ListList(string name, List values) { Name = name; Values = values; }
        }


            
                
                    
                        
                            
                                
                            
                        
                    
                
            
        
0
adăugat
CE? Ce parte din aceasta nu este o listă de 2 ierarhii în cadrul unei liste? public Lista ListaList1 {get {retur nou Lista {new ListList ("name1", new List {"one", "two", "three"})}; }} Și funcționează.
adăugat autor paparazzo, sursa
Instrucțiunea de problemă este "selectați elementul care a fost selectat anterior". Marcați declarația dvs. de problemă pentru a nu fi clară decât pentru a marca acest răspuns.
adăugat autor paparazzo, sursa
Faceți o listă într-o listă și aceasta funcționează încă pentru mine.
adăugat autor paparazzo, sursa
Marchez răspunsul pentru că nu este clar. O sursă de element nu este validă - nu are proprietate Data de expirare. Include blocuri de text care nu par să facă parte din problemă. Trei "re-selectare" nu este încă clar. Ar fi clar: Selectați un element prima dată și evenimentul se declanșează. Selectați un alt element pentru prima dată și evenimentul se declanșează. Selectarea unui element a doua oară declanșează evenimentul chiar dacă selectăm un alt element și revenim.
adăugat autor paparazzo, sursa
Tu ești cel cu această întrebare și întreabă dacă pot codifica. Arătați ceva efort și curățați-vă propria întrebare. Numai codul de postare a problemei cu datele pentru a reproduce problema este în mod clar va produce răspunsuri mai bune.
adăugat autor paparazzo, sursa
Setați o listă din lista Datatemplate și încercați să modificați modificarea selecției. Cred că ceea ce încerci să faci este doar lista într-o listă cu o ierarhie.
adăugat autor 123 456 789 0, sursa
adăugat autor 123 456 789 0, sursa
Apropo, verificați structura mea actualizată. Soluția dvs. va funcționa conform așteptărilor, dar încercați o entitate care are o proprietate a listei.
adăugat autor 123 456 789 0, sursa
Nu vă cer să codificați pentru mine. Eu însumi investighez. Se pare că lista despre copil este dezactivată.
adăugat autor 123 456 789 0, sursa
Unul, nu contează dacă proprietățile nu există pentru unele proprietăți. Știți cum să codificați în WPF? În al doilea rând, există o opțiune de editare pentru ca întrebarea să fie clară. Și dacă propoziția pe care o reformulați, credeți că este clar pentru toată lumea, atunci mergeți să o editați și o voi aproba.
adăugat autor 123 456 789 0, sursa
Acționând ca un copil acum, pentru că cineva ți-a marcat răspunsul ca fiind în jos, vei marca întrebarea ca în jos. Ar trebui să întrebați în comentariu dacă ceva nu este clar, nu toată lumea în stackoverflow are engleză bună. Și cum o să clarificați atunci? "Selectați elementul selectat anterior" nu înseamnă că ați selectat deja elementul respectiv și că l-ați re-selectat?
adăugat autor 123 456 789 0, sursa
Nu când selectați alt element și selectați din nou elementul respectiv.
adăugat autor 123 456 789 0, sursa

Pentru a răspunde la întrebarea dvs. ...

Vreau să știu dacă motivul pentru care SelectionChanged ar declansa o singură dată și nu va declanșa SelectionChanged din nou după ce am încercat să selectez articolul selectat anterior.

... într-o învățare prin a face drumul

deschideți un nou proiect wpf adăugați 2 cutii de liste creați un eveniment SelectionChanged pentru ambele și adăugați câteva elemente în fiecare listă

hai să menționăm că arată acum așa

    
    

.

        var list = new List();
        list.Add("Element1");
        list.Add("Element2");
        list.Add("Element3");
        list.Add("Element4");

        listBox1.ItemsSource = list;
        listBox2.ItemsSource = list;

Dacă selectați acum Element1 în listBox1 , listBox_SelectionChanged primiți triggert după aceea selectați Element2 /code>, astfel încât lista listBox_SelectionChanged să fie declanșată din nou.

Dacă țineți o privire mai atentă la listBox1 veți vedea că Background în spatele elementului Element1 este gri, ceea ce înseamnă că este selectat focuse. Dacă selectați acum Element1 din lista listBox1 din nou, listBox_SelectionChanged nu primește triggert deoarece selecția nu schimbă numai focalizarea.

Aceasta este exact aceeași "problemă" este în codul dvs., deoarece codul dvs. DataTemplate face același lucru cred că am făcut-o pe măsură ce am adăugat cele 2 cutii de listă doar în mod automat

ca soluție simplă și murdărie ați putea folosi următorul cod

    private object seletedItem;
    private ListBox ItemsHost;

    private void Test(object sender, SelectionChangedEventArgs e)
    {
        var buff = sender as ListBox;

        if (seletedItem != null)
            if (ItemsHost != buff)
                ItemsHost.SelectedItem = null;

        ItemsHost = buff;

        if (e.AddedItems.Count > 0)
            seletedItem = e.AddedItems[0];
    }
0
adăugat

Soluția simplă pe care am aflat-o este să faceți selectedItem ca null în procedura de tratare a evenimentului.

private void tempList_SelectionChanged(object sender, SelectionChangedEventArgs e)

{    
    Card selectedOffer = (TempList.SelectedItem as Card);
    if (selectedOffer != null)
    {
        MessageBox.Show(selectedOffer._id);
    }
    ListBoxNeeded.SelectedItem = null;
}
0
adăugat