Selecteer bovenliggende ListBoxItem bij CheckBox-interactie

Simpele vraag echter. Ik heb een WPF-toepassing (.NET 4.0). Er is een listbox met een aantal gebruikerspanelen. Elk van deze gebruikerspanelen bevat een selectievakje.

Tijdens het uitvoeren kunt u klikken op een willekeurig deel van het gebruikerspaneel, behalve het selectievakje zelf, en de keuzelijst selecteert die rij (die in dit eenvoudige geval visueel wordt aangegeven door de achtergrondwijziging). Als u het selectievakje inschakelt, is de rij niet geselecteerd.

eis: Als u het selectievakje aanvinkt, moet dit tellen als het selecteren van de rij.

Checkbox-besturing:


    
        
    

Hoofd venster:


            
        
        
        
        
    

1

1 antwoord

Je zou dit in je UserControl code achter kunnen laten:

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        var parent = sender as DependencyObject;

        while (parent != null)
        {
            if (parent is Selector)
                break;

            parent = VisualTreeHelper.GetParent(parent);
        }

        if (parent != null)
            ((Selector) parent).SelectedItem = this;
    }

En gebruik vervolgens de handler in uw CheckBox :


Bewerken

Als u geen code achter wilt laten, is het beste wat ik denk dat u kunt doen om de bestaande oplossing te verpakken als gekoppeld gedrag. Dit heeft het voordeel dat u de code slechts eenmaal hoeft te schrijven en dat de eigenschap op elke knop kan worden ingesteld, zelfs als deze niet deel uitmaakt van een UserControl .

Bijvoorbeeld:

public static class ButtonClickHelper
{
    public static void SetEnableSelectionOnClick(ButtonBase button, bool value)
    {
        button.SetValue(EnableSelectionOnClickProperty, value);
    }

    public static bool GetEnableSelectionOnClick(ButtonBase button)
    {
        return (bool) button.GetValue(EnableSelectionOnClickProperty);
    }

    public static readonly DependencyProperty EnableSelectionOnClickProperty =
        DependencyProperty.RegisterAttached("EnableSelectionOnClick", typeof (bool), typeof (ButtonClickHelper),
                                            new FrameworkPropertyMetadata(OnEnableSelectionOnClickPropertyChanged));

    private static void OnEnableSelectionOnClickPropertyChanged(DependencyObject d,
                                                                DependencyPropertyChangedEventArgs e)
    {
        if (!(d is ButtonBase))
            return;

        var button = (ButtonBase) d;
        if ((bool) e.NewValue)
        {
            button.Click += OnButtonClick;
        }
        else
        {
            button.Click -= OnButtonClick;
        }
    }

    private static void OnButtonClick(object sender, RoutedEventArgs e)
    {
        var parent = sender as DependencyObject;
        var ancestors = new List();

        while (parent != null)
        {
            if (parent is Selector)
                break;

            parent = VisualTreeHelper.GetParent(parent);
            ancestors.Add(parent);
        }

        if (parent != null)
        {
            var selector = (Selector) parent;
            var itemToSelect = ancestors.Where(i => selector.Items.Contains(i)).FirstOrDefault();

            if (itemToSelect != null)
                ((Selector) parent).SelectedItem = itemToSelect;
        }
    }
}

Dan kunt u dit in uw XAML gebruiken door de afhankelijkheidseigenschap EnableSelectionOnClick in te stellen:


Ik hoop dat dit helpt!

2
toegevoegd