Laden...

WPF, MVVM - ListBox - Selektion leeren bei ESC

Erstellt von Froggie vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.307 Views
F
Froggie Themenstarter:in
323 Beiträge seit 2007
vor 9 Jahren
WPF, MVVM - ListBox - Selektion leeren bei ESC

Hallo!

Wie kann ich in einem WPF-Projekt welches nach MVVM umgesetzt ist die Selektion einer ListBox bei einem Druck auf ESC (oder einem Klick in den freien Bereich) entfernen?

Meine View hat keinen Code im CodeBehind.
Hier ein wenig meines Quellcodes:

View:


<UserControl .....
d:DataContext="{d:DesignInstance Type=viewModel:ColorChooserViewModel, IsDesignTimeCreatable=True}">
...
 <ListBox  ...
                  ItemsSource="{Binding AvailableColors}"
                  SelectedItem="{Binding ChosenColor}"
                  SelectionMode="Single">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    ...
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
...
</UserControl>

ViewModel:


public class ColorChooserViewModel : ModelBase
    {
...
public ChooseColor ChosenColor
        {
            get { return chosenColor; }
            set
            {
                if (chosenColor != value)
                {
                    chosenColor = value;
                    RaisePropertyChanged(() => ChosenColor);

                    DelegateCommand.RaiseCanExecuteChanged();
                }
            }
        }

        public ObservableCollection<ChooseColor> AvailableColors
        {
            get { return availableColors; }
            set
            {
                if (availableColors != value)
                {
                    availableColors = value;
                    RaisePropertyChanged(() => AvailableColors);
                }
            }
        }
...
}

Model:


public class ChooseColor : ModelBase
    {
...
 public int Id
        {
            get { return id; }
            set
            {
                id = value;
                RaisePropertyChanged(idArgs);
            }
        }

        public BitmapImage Image
        {
            get { return image; }
            set
            {
                image = value;
                RaisePropertyChanged(imageArgs);
            }
        }
...
}

T
314 Beiträge seit 2013
vor 9 Jahren

Hmmm als Stichwort vielleicht EventToCommand. Hoffe das hilft dir bereits weiter.

709 Beiträge seit 2008
vor 9 Jahren

Hallo Froggie,

für den Tastendruck würden sich KeyBindings anbieten.
Je nach dem, wo diese überall gültig sein sollen, müssen die natürlich auch an einem anderen Ort definiert werden.

Beispiel:

<Window.InputBindings>
    <KeyBinding Command="{Binding UnselectAllCommand}" Key="Escape"/>
</Window.InputBindings>
W
113 Beiträge seit 2006
vor 9 Jahren

Hallo Froggie,

ich würde das im Code-Behind der View machen.

Da es meiner Meinung nach eine reine GUI-Angelegenheit ist, sollte das ViewModel damit nichts zu tun haben.

mfg,
Xan

M
171 Beiträge seit 2012
vor 9 Jahren

Würde ich nicht machen. UnselectAll kann ein Anwendungsfall für jede denkbare View sein. Ein UnselectAllCommand könnte z.B. ein entsprechendes Property im ViewModel umsetzen, an das alle Controls, die darauf reagieren wollen, gebunden sind.

Dann ist die Implementierung im ViewModel völlig unabhängig von der jeweiligen View, die gerade verwendet wird.