Meine Frage ist einfach:
Ich habe eine Liste enthält einige DataTemplate
. Wie Sie sehen, ich habe das SelectionChanged
Ereignis innerhalb der Listbox:C# WPF: Feuer SelectionChanged Ereignis zuerst vor anderen Ereignissen
SelectionChanged = "stationListBox_SelectionChanged"
und das mouseDown- Ereignis innerhalb des Gitters (das Gitterteil der Datenvorlage ist):
MouseDown = "Grid_MouseDown"
Ich möchte die SelectionChanged
Veranstaltung zu gefeuert zuerst und dann die MouseDown
Ereignis. Das, weil ich etwas auf dem ausgewählten Gegenstand tun möchte, so muss ich zuerst wissen, wen ich wählte.
die XML:
<ListBox x:Name="stationListBox" Grid.Row="0" ItemsSource="{Binding}" SelectionChanged="stationListBox_SelectionChanged" Background="#FF5C7591"
VerticalAlignment="Stretch" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch">
<ListBox.Resources>
<DataTemplate DataType="{x:Type viewModels:StationViewModel}">
<Grid Margin="0,0,0,2" IsEnabled="{Binding IsEnabled, Mode=TwoWay}" MouseDown="Grid_MouseDown" >
<Frame BorderBrush="#B935373F" BorderThickness="4"></Frame>
<StackPanel Orientation="Vertical" Margin="10" >
<StackPanel Orientation="Horizontal">
<Image Width="30" Height="30" Margin="3,0" Source="Images\station.png" HorizontalAlignment="Left" />
<TextBlock Text="{Binding Name}" FontSize="14" TextAlignment="Left" Width="80" FontFamily="Arial"/>
<Grid>
<Image Width="20" Height="20" Margin="3,0" Source="Images\turnOn.png" HorizontalAlignment="Right" Visibility="{Binding IsStationOpen, Mode=TwoWay}" />
<Image Width="20" Height="20" Margin="3,0" Source="Images\turnOff.png" HorizontalAlignment="Right" Visibility="{Binding IsStationClose, Mode=TwoWay}" />
</Grid>
<Image Width="20" Height="20" Margin="3,0" Source="Images\delete2.png" HorizontalAlignment="Right" Visibility="{Binding Mode=TwoWay, Path=IsSelected}"
ToolTip="Delete station" MouseDown="Image_MouseDown" />
</StackPanel>
<StackPanel Name="_editStationGrid" Orientation="Vertical" Visibility="{Binding IsEditable,Mode=TwoWay}">
<Expander Visibility="Visible" IsExpanded="{Binding IsExpandered, Mode=TwoWay}">
<Expander.Header>
<StackPanel Orientation="Horizontal">
<TextBlock>Edit Station:</TextBlock>
</StackPanel>
</Expander.Header>
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Horizontal" Margin="20,5,5,5" >
<Label Content="Name:"/>
<TextBox MinWidth="120" Text="{Binding Name, Mode=TwoWay}"></TextBox>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="20,0,5,0" >
<Label Content="IP:" Margin="0,0,20,0"/>
<TextBox MinWidth="120" Text="{Binding IP, Mode=TwoWay}" ></TextBox>
</StackPanel>
</StackPanel>
</Expander>
</StackPanel>
</StackPanel>
</Grid>
</DataTemplate>
</ListBox.Resources>
</ListBox>
der Code:
private void stationListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
this._selectedStation = ((StationViewModel)this.stationListBox.SelectedItem);
}
private void Grid_MouseDown(object sender, MouseButtonEventArgs e)
{
if (inEditMode && e.ClickCount == 1)
{
if (_selectedStation.IsSelected == System.Windows.Visibility.Visible)
_selectedStation.IsSelected = System.Windows.Visibility.Collapsed;
else
_selectedStation.IsSelected = System.Windows.Visibility.Visible;
}
if (!inEditMode && e.ClickCount == 2)
{
if (_selectedStation_Event != null)
_selectedStation_Event(_selectedStation);
}
}
Warum Sie nicht tun, dass etwas in Selectionereignishandler? – EvAlex
weil ich beobachten muss, ob es einen Klick auf das Element oder Doppelklick gab und dafür benötige ich das mouseEventArgs Objekt (e.Clicks Eigenschaft). Ich brauche das zuerst die Auswahl ändert sich und dann nach dem mouseDown Ereignis Feuer. –