2017-01-24 2 views
1

In meinem Listenansicht habe ich eine Steuerelementvorlage erstellt. Innerhalb dieser Vorlage habe ich eine Schaltfläche erstellt, so dass jedes Element in der Listenansicht eine Schaltfläche hat. Diese Schaltfläche stellt einen Link dar, der das angezeigte Verzeichnis öffnet. Wenn ich auf den Knopf klicke, öffnet mein Programm den Explorer, wie ich es erwarte. Wenn ich jedoch auf die Schaltfläche eines nicht ausgewählten Elements klicke, öffnet sich der Pfad des ausgewählten Objekts. Meine Frage ist also, wie kann ich den ausgewählten Artikel ändern, wenn ich auf den Button in meiner Listenansicht klicke.So wählen Sie den Listenansichtsartikel aus, wenn Sie auf die Schaltfläche klicken

Hier ist, wie es aussieht:

enter image description here

Wie Sie "R1" sehen können ausgewählt ist, aber ich klicken Sie auf den Link "R3". Was passiert, ist, dass C: \ Temp \ Folder1 geöffnet wird, weil "R1" immer noch das ausgewählte Element ist. Was ich möchte ist, dass C: \ Temp \ Folder3 geöffnet wird. Ich denke, der Trick sollte sein, dass "R3" ausgewählt wird, wenn man auf den Knopf klickt, der den Link darstellt. Weiß jemand wie das?

Das ist mein XAML-Code:

<ListView Grid.Row="1" ItemsSource="{Binding MyCollection}" FontSize="20" SelectedItem="{Binding SelectedMember, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="7,10,7,0" x:Name="ListView1" SelectionChanged="ListView1_SelectionChanged"> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn Header="Header 1" Width="150"/> 
        <GridViewColumn Header="Header 2" Width="120"/> 
        <GridViewColumn Header="Header 3" Width="120"/> 
        <GridViewColumn Header="Header 4" Width="560"/> 
        <GridViewColumn Header="Header 5" Width="100"/> 
       </GridView> 
      </ListView.View> 
      <ListView.ItemContainerStyle> 
       <Style TargetType="{x:Type ListViewItem}" BasedOn="{StaticResource {x:Type ListBoxItem}}"> 
        <EventSetter Event="MouseDoubleClick" Handler="ListViewItem_MouseDoubleClick"/> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate> 
           <Grid> 
            <Grid.ColumnDefinitions> 
             <ColumnDefinition Width="150"/> 
             <ColumnDefinition Width="120"/> 
             <ColumnDefinition Width="120"/> 
             <ColumnDefinition Width="560"/> 
             <ColumnDefinition Width="100"/> 
            </Grid.ColumnDefinitions> 
            <ContentPresenter Grid.Column="0" Content="{Binding ID}" HorizontalAlignment="Center"/> 
            <ContentPresenter Grid.Column="1" Content="{Binding Name}" HorizontalAlignment="Center"/> 
            <ContentPresenter Grid.Column="2" Content="{Binding Description}" HorizontalAlignment="Center"/> 
            <Button Grid.Column="3" Content="{Binding Path}" Style="{StaticResource Link}" Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.GoToPathCommand }" HorizontalAlignment="Left" Margin="5,0,0,0" IsEnabled="{Binding ButtonEnabled}"/> 
            <ContentPresenter Grid.Column="4" Content="{Binding Owner}" HorizontalAlignment="Center"/> 
           </Grid> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
        <Style.Triggers> 
         <Trigger Property="IsSelected" Value="True"> 
          <Setter Property="FontWeight" Value="Bold"/> 
          <Setter Property="Foreground" Value="DarkBlue"/> 
         </Trigger> 
        </Style.Triggers> 
       </Style> 
      </ListView.ItemContainerStyle> 
     </ListView> 

Antwort

1
Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.GoToPathCommand }" 

Dieser Befehl wird zum Cmd des ViewModel springen. Ich nehme an, dass der Befehl prüft, welches Element ausgewählt ist und auf seine Eigenschaft Path zugreifen wird.

Vermeidung dieses Verhalten, können Sie einen Befehl erstellen, der einen Parameter nehmen und setzen Sie ihn von Bindung:

<Button Content="{Binding Path}" 
    Command="{Binding RelativeSource={RelativeSource FindAncestor, 
        AncestorType={x:Type Window}}, Path=DataContext.GoToPathCommand }" 
CommandParameter="{Binding Path}"/> 

nun der Befehl selbst eingestellt werden muss:

public MyCmd : ICommand 
{ 

    public void Execute(object parameter) 
    { 
     string path = (string) parameter; 
     //Open the path via explorer 
    } 
} 
0

Versuchen unter Trigger Hinzufügen zu in dem ListViewItem Stil

   <Style.Triggers> 
       <Trigger Property="IsKeyboardFocusWithin" Value="True"> 
        <Setter Property="IsSelected" Value="True"/> 
        </Trigger> 
      </Style.Triggers> 
+0

, dass fast, was ich Ich suche nach, aber es verursacht ein anderes Problem. Das Klicken auf den Button funktioniert jetzt einwandfrei. Aber wenn ich "R1" wähle und auf "Akzeptieren" klicke, ist der Fokus auf den ausgewählten Gegenstand verloren. – L4c0573

Verwandte Themen