2017-06-19 36 views
0

我有以下列表視圖:WPF列表視圖:當選擇的ListViewItem檢測,然後檢查它

<ListView Margin="10" Name="lvUsers" AlternationCount="2" SelectionMode="Extended"> 

<ListView.View> 
    <GridView> 
     <!-- Checkbox header --> 
      <GridViewColumn> 

       <GridViewColumn.Header> 
        <CheckBox Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked"/> 
       </GridViewColumn.Header> 

       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <StackPanel Orientation="Horizontal"> 
          <CheckBox IsChecked="{Binding IsChecked}" /> 
         </StackPanel> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 

      <GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Name}" /> 
     <GridViewColumn Header="Age" Width="50" DisplayMemberBinding="{Binding Age}" /> 
     <GridViewColumn Header="Mail" Width="150" DisplayMemberBinding="{Binding Mail}" /> 
    </GridView> 
</ListView.View> 

    <!-- SELECTED ITEM EVENT --> 
    <ListView.ItemContainerStyle> 
     <Style TargetType="ListViewItem"> 
      <EventSetter Event="PreviewMouseLeftButtonDown" Handler="ListViewItem_MouseLeftButtonDown" /> 
     </Style> 
    </ListView.ItemContainerStyle> 

</ListView> 

和代碼隱藏的事件:

private void ListViewItem_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     var item = sender as ListViewItem; 
     if (item != null && item.IsSelected) 
     { 
      //Do your stuff 
     } 

    } 

和這個數據模型:

public class User : INotifyPropertyChanged 
{ 
    private bool isChecked = false; 
    private string name = string.Empty; 
    private int age = 0; 
    private string mail = string.Empty; 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(String propertyName) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    public bool IsChecked { 
     get 
     { 
      return this.isChecked; 
     } 

     set 
     { 
      if (value != this.isChecked) 
      { 
       this.isChecked = value; 
       NotifyPropertyChanged("IsSelected"); 
      } 
     } 
    } 

    public string Name 
    { 
     get 
     { 
      return this.name; 
     } 

     set 
     { 
      if (value != this.name) 
      { 
       this.name = value; 
       NotifyPropertyChanged("Name"); 
      } 
     } 
    } 

    public int Age { 
     get 
     { 
      return this.age; 
     } 

     set 
     { 
      if (value != this.age) 
      { 
       this.age = value; 
       NotifyPropertyChanged("Age"); 
      } 
     } 
    } 

    public string Mail { 
     get 
     { 
      return this.mail; 
     } 

     set 
     { 
      if (value != this.mail) 
      { 
       this.mail = value; 
       NotifyPropertyChanged("Mail"); 
      } 
     } 
    } 
} 

我有一個複選框在列表視圖標題和checbox爲每個listview項目。

我想檢測當一個listviewitem被選中,然後一旦選擇我想把它標記爲檢查。 ListViewiteitem事件PreviewMouseLeftButtonDown不起作用,當item.IsSelected爲false時,因爲它是在鼠標左鍵按下之前發生的預覽。沒有MouseClick事件,只有MouseDoubleClick。

此外,一旦listviewitem點擊我想標記爲選中(複選框選中)。

我該怎麼做?

+2

爲什麼不將'SelectedItem'綁定到屬性?並使用轉換器將checkbox.checked綁定到該屬性 – Vallo

+0

注意,您必須在IsChecked屬性設置器中調用'NotifyPropertyChanged(「IsChecked」)'而不是'NotifyPropertyChanged(「IsSelected」)'。 – Clemens

回答

2

綁定IsSelected財產在ListViewItem的風格:

<ListView.ItemContainerStyle> 
    <Style TargetType="ListViewItem"> 
     <Setter Property="IsSelected" Value="{Binding IsChecked}"/> 
    </Style> 
</ListView.ItemContainerStyle> 

作爲一個說明,以避免與屬性名印刷錯誤,您可以使用CallerMemberName屬性,這使得編譯器生成正確的屬性名稱:

using System.Runtime.CompilerServices; 
... 

private void NotifyPropertyChanged([CallerMemberName] string propertyName = null) 
{ 
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
} 

public bool IsChecked 
{ 
    get { return isChecked; } 
    set 
    { 
     isChecked = value; 
     NotifyPropertyChanged(); 
    } 
}