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);
}
}
...
}
Hmmm als Stichwort vielleicht EventToCommand. Hoffe das hilft dir bereits weiter.
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>
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
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.