Entschuldigung, wenn Sie denken, dies ist eine Duplizierung eines anderen Beitrags, aber ich habe versucht alle mögliche Lösung da draußen und ich kann es nicht funktionieren.Bind MausLeftButtonDown für ListBoxItem und Hintergrundfarbe auf PropertyChanged (MVVM, WPF)
Die Frage ist ein Zwei-Partner, aber es ist ungefähr der gleiche Code, also dachte ich, ich kann die Frage im selben Thread stellen.
Ich versuche, Bestellsystem in C#, wpf, vs2015 mit MVVM ohne (hart codierte) Kupplungen zu tun. Es gibt zwei Dinge, die ich tun muss. Zuerst muss ein Ereignis ausgelöst werden, das ich im ViewModel erfassen muss, und zweitens, wenn die Anzahl der Artikel über einem bestimmten Level liegt, sollte der Hintergrund des Listboxitems für diesen Artikel grün sein (sonst weiß/grau)
Dazu benutze ich eine ListBox und einige listBoxItems.
MainWindow.xaml (der Teil, der zählt)
<Window x:Class="Sequence_Application_2.GUI.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:acb="clr-namespace:AttachedCommandBehavior;assembly=AttachedCommandBehavior"
mc:Ignorable="d"
....
<Window.DataContext>
<Grid Grid.Column="0" Margin="10">
<ListBox x:Name="LstViewFlows" SelectedItem="{Binding SelectedFlow.Name}" ItemsSource="{Binding Flows.Keys}" >
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}" >
<Style.Triggers>
<DataTrigger Binding="{Binding SelectedFlow.CanDeliver, UpdateSourceTrigger=PropertyChanged}" Value="true" >
<Setter Property="ListBoxItem.Background" Value="DarkGreen" />
<Setter Property="FontWeight" Value="Bold"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseLeftButtonDown">
<i:InvokeCommandAction Command="{Binding SetSelectedCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</ListBox>
</Grid>
Frage 1)
Ich brauche einen Befehl an einem "Mouseleftbuttondown" -Ereignis zu binden, wenn ich auf einem ListBoxItem in einem Listenfeld klicken . Ich habe die ACB-Lösung ausprobiert, kann sie aber nicht zum Laufen bringen. Endlich habe ich den obigen Code ausprobiert und ich kann es nicht auslösen, wenn ich auf einen Gegenstand klicke, aber unterhalb der Gegenstände, im leeren Teil der Listbox (nicht auf einem Listboxitem), toggelt er wie er sollte. Ich denke, ich muss meine XAML-Datei neu anordnen, aber ich habe es seit zwei Tagen versucht, aber nichts scheint zu funktionieren.
Der Befehl wird „setSelectedCommand“ benannt und umgesetzt wird, wie diese
internal class SetSelectedFlowCommand : ICommand
{
private FlowsViewModel _flowsViewModel;
public SetSelectedFlowCommand(FlowsViewModel flowsViewModel)
{
_flowsViewModel = flowsViewModel;
}
/// <summary>
///
/// </summary>
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public bool CanExecute(object parameter)
{
return true;
}
public void Execute(object parameter)
{
_flowsViewModel.SetSelectedFlow();
}
}
Wie gesagt, wenn ich auf dem ListBoxItem klicken - nichts happends, aber wenn ich in der List-Box klicken - der Befehl wird ausgelöst (aber nichts ist „ausgewählt“)
Frage 2
Wie Sie in der xAML oben zu sehen, die ich versuche, die Hintergrundfarbe für eine ListBoxItem zu setzen, basierend auf dem Wert .CanDeliver in einem Objekt, das wird in einem Verzeichnis im ViewModel gespeichert. Die Variable Flow ist das Wörterbuch und SelectedFlow soll der ausgewählte Flow sein.
Dies ist ein Bestellsystem und CanDeliver ist eine Variable, die dem Bediener/Benutzer mitteilt, ob genug Produkte für den Kunden verfügbar sind. Wenn es genug gibt, sollte das Listboxitem grün sein, ansonsten bleibt es weiß/grau. Verstehen Sie meine Frage? Kann ich es so machen? Verweisen auf ein Objekt in einem Wörterbuch? (Es ist von einem INotifyPropertyChanged in den Objekten ausgelöst)
Hoffe ihr könnt mir helfen kann, weil ich nicht mehr Haare aus meinem Kopf ziehen jetzt ;-)
Es sollte stattdessen Property = "ListBoxItem.Background" richtige Eigenschaft = "Hintergrund" sein? – Archana
Sie können beide Wege schreiben, auch wenn "ListBoxItem.Background" redundant ist. – ZombieGoose