2012-04-11 7 views
1

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); 
    } 
} 
+2

Warum Sie nicht tun, dass etwas in Selectionereignishandler? – EvAlex

+0

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. –

Antwort

1

Sie können die Dispatcher-Objekt verwenden:

private void Grid_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     this.Dispatcher.BeginInvoke(new Action(delegate 
     { 
      // do stuff 
     } 
     )); 
    } 
+0

das hilft mir nicht, denn ich muss zuerst wissen, wer die ausgewählte ite ist, um die Sache mit diesem Gegenstand zu machen. –

+0

Haben Sie es versucht? Wenn Sie den Dispatcher verwenden, wird die Ereigniswarteschlange verwendet, um die Verarbeitung des jeweiligen Handlers zu verzögern. Das SelectedChanged-Ereignis wird dann zuerst auftreten. Siehe [link] (http://msdn.microsoft.com/en-us/library/cc190824.aspx) – Stephen

+0

Danke es funktioniert !!!!!! –

Verwandte Themen