2011-06-06 63 views
1

目標:
需要在列表視圖中選擇包含單個行的按鈕。按鈕列表中的單個選項按鈕

問題:
當您點擊位於listview內部的按鈕時,不知道如何在列表視圖中進行單個選擇。在一個簡單的解釋中,當點擊按鈕時,沒有選擇將被應用在列表視圖的行中

如果在輸入按鈕的方法之前應用選擇會很好因爲我需要從listview的單選中獲取信息應該發送給業務邏輯。


private void btnBuy_Click(object sender, RoutedEventArgs e) 
{ 

} 
<ListView Height="242.47" Canvas.Left="8" Canvas.Top="49.53" Width="435.22" Name="lstOrder" ItemsSource="{Binding}" 
     PreviewMouseLeftButtonUp="lstOrder_PreviewMouseLeftButtonUp" SelectionChanged="lstOrder_SelectionChanged" 
     SelectionMode="Single"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="Article Number" Width="auto" DisplayMemberBinding="{Binding Path=_articleNumber}" 
        TextBlock.TextAlignment="Left" 
        HeaderContainerStyle="{StaticResource ListViewHeaderRightAlignedStyle}" /> 
      <GridViewColumn Header="Name" Width="auto" DisplayMemberBinding="{Binding Path=_name}" 
        TextBlock.TextAlignment="Left" 
        HeaderContainerStyle="{StaticResource ListViewHeaderRightAlignedStyle}" /> 
      <GridViewColumn Header="Sale Price" Width="auto" DisplayMemberBinding="{Binding Path=_salePrice}" 
        TextBlock.TextAlignment="Left" 
        HeaderContainerStyle="{StaticResource ListViewHeaderRightAlignedStyle}" /> 
      <GridViewColumn Header="Product Category" Width="auto" 
        DisplayMemberBinding="{Binding Path=_productCategory}" TextBlock.TextAlignment="Left" 
        HeaderContainerStyle="{StaticResource ListViewHeaderRightAlignedStyle}" /> 
      <GridViewColumn Header="Quantity" Width="auto" DisplayMemberBinding="{Binding Path=_quantity}" 
        TextBlock.TextAlignment="Left" 
        HeaderContainerStyle="{StaticResource ListViewHeaderRightAlignedStyle}" /> 
      <GridViewColumn> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <Button Name="btnBuy" MinHeight="20" MinWidth="50" Content="Buy" Click="btnBuy_Click" /> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
     </GridView> 
    </ListView.View> 
</ListView> 

namespace MediaStore 
{ 
    /// <summary> 
    /// Interaction logic for Counter.xaml 
    /// </summary> 
    public partial class Counter : Window 
    { 
     private ManagerProduct _myManagerProduct; 
     private ManagerCart _myManagerCart; 

    public Counter(ManagerProduct pManagerProduct, ManagerCart pMyManagerCart) 
    { 
     this.InitializeComponent(); 

     _myManagerProduct = pManagerProduct; 
     _myManagerCart = pMyManagerCart; 


     lstOrder.AddHandler(ListViewItem.UnselectedEvent, new RoutedEventHandler(ItemSelected), true); 


     UpDateGUI(); 
    } 


    public void UpDateGUI() 
    { 
     FillDataInListView(); 
    } 

    private void FillDataInListView() 
    { 
     lstOrder.DataContext = _myManagerProduct.GetAllProductList(); 
    } 

    #region Tab Order - 1. Order 

    private void btnBuy_Click(object sender, RoutedEventArgs e) 
    { 

    } 

    private void btnDisplayCart_Click(object sender, RoutedEventArgs e) 
    { 

    } 

    private void btnCheckout_Click(object sender, RoutedEventArgs e) 
    { 
     cvsOrder.Visibility = Visibility.Hidden; 

     cvsConfirmation.Margin = new Thickness(8, 8, 8, 17); 
    } 

    private void lstOrder_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 


    } 


    private void ItemSelected(object sender, RoutedEventArgs e) 
    { 

    } 


    private void lstOrder_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 

    } 
    #endregion 

    } 

} 

回答

4

你不應該需要選擇ListViewItem的,你可以從ButtonDataContext讓您的數據對象,你不需要從數據其他行無論如何你都想要一個選擇。

在事件處理程序:

var data = (sender as FrameworkElement).DataContext as MyData; 

在一個側面說明,他這樣說,你需要在所有的選擇。如果不使用ItemsControl?)

爲了使ListViewItem選擇自己,如果按鈕被點擊,你可以使用這樣一個ItemContainerStyle

<ListView.ItemContainerStyle> 
    <Style TargetType="{x:Type ListViewItem}"> 
     <Setter Property="IsSelected" 
       Value="{Binding RelativeSource={RelativeSource Self}, Path=IsKeyboardFocusWithin, Mode=OneWay}" /> 
    </Style> 
</ListView.ItemContainerStyle> 

這裏是使用後的ListView失去聚焦其保留所選擇的項目的動畫的替代方案(僅與ListView.SelectionModeSingle工作,它似乎並不可能以清除利用動畫先前的選擇):

<Style TargetType="{x:Type ListViewItem}"> 
    <Style.Triggers> 
     <DataTrigger 
       Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsKeyboardFocusWithin, Mode=OneWay}" 
       Value="True"> 
      <DataTrigger.EnterActions> 
       <BeginStoryboard> 
        <Storyboard> 
         <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsSelected"> 
          <DiscreteBooleanKeyFrame KeyTime="0" Value="True" /> 
         </BooleanAnimationUsingKeyFrames> 
        </Storyboard> 
       </BeginStoryboard> 
      </DataTrigger.EnterActions> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 
+0

1.可以更具體地指出,在類Counter中應該將這個代碼「var data =(sender as FrameworkElement).DataContext as MyData;」應用? – 2011-06-06 17:09:54

+0

2.「MyData」類的名稱? – 2011-06-06 17:10:41

+0

...我注意到代碼屬於按鈕事件處理程序。 'MyData'是你的'ListView.ItemsSource'中的任何類的實例的名稱。 – 2011-06-06 17:18:07