2017-01-24 124 views
1

在我的listview裏面我創建了一個控件模板。在這個模板中,我製作了一個按鈕,以便列表視圖中的每個項目都有一個按鈕。該按鈕代表一個打開顯示的目錄的鏈接。當我點擊按鈕時,我的程序就像我期望的那樣打開瀏覽器。但是當我點擊一個未被選中的項目的按鈕時,它會打開所選項目的路徑。所以我的問題是,當我點擊列表視圖中的按鈕時,如何更改所選項目。如何在點擊按鈕時選擇listview項目

這裏是如何看起來像:

enter image description here

正如你可以看到「R1」被選中,但我點擊「R3」的鏈接。會發生什麼,C:\ Temp \ Folder1被打開,因爲「R1」仍然是selecteditem。我想要的是C:\ Temp \ Folder3獲得opend。我認爲訣竅應該是當點擊表示鏈接的按鈕時選擇「R3」。有誰知道如何做到這一點?

這是我的XAML碼:

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

回答

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

這個命令將跳轉到ViewModel的Cmd的。我假設命令將檢查選擇哪個項目,並且它將訪問它的屬性Path

避免這種行爲,您可以創建一個命令,將採取一個參數,並從綁定設置:

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

現在命令本身必須調整:

public MyCmd : ICommand 
{ 

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

嘗試增加低於觸發過的ListViewItem的風格

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

這幾乎是我正在尋找,但它會導致另一個問題。點擊該按鈕即可正常工作。但是當我選擇「R1」並點擊「接受」按鈕時,所選項目的焦點就會丟失。 – L4c0573

相關問題