2016-04-05 29 views
1

我想寫一個簡單的應用程序,其中我顯示一個列表視圖使用數據綁定包含多個對象列出其屬性和複選框。我讓用戶檢查他們想要刪除的所有框,然後按下一個按鈕來刪除選定的元素。如何在wpf應用程序中傳遞gridrow中的所有值?

public partial class MainWindow : Window 
{ 
    ObservableCollection<User> Users = new ObservableCollection<User>(); 
    public MainWindow() 
    { 
     System.Console.WriteLine("main window"); 
     Users.Add(new User() { Name = "John Doe", Age = 42, Height = "6ft", Checked = false}); 
     Users.Add(new User() { Name = "Jane Doe", Age = 39, Height = "6ft", Checked = false }); 
     Users.Add(new User() { Name = "Sammy Doe", Age = 7, Height = "5ft", Checked = false }); 
     drawFolderView(); 
    } 
    private void drawFolderView() 
    { 
     InitializeComponent(); 
     lvUsers.ItemsSource = Users; 
    } 
    private void button_Click(object sender, RoutedEventArgs e) 
    { 
     if (Users.Count > 0) 
     { 
      List<User> itemsToRemove = new List<User>(); 

      foreach (User person in Users) 
      { 
       if (person.Checked) 
       { 
        itemsToRemove.Add(person); 
       } 
      } 
      foreach (User person in itemsToRemove) 
      { 
       Users.Remove(person); 
      } 

     } 
     else 
     { 
      System.Console.WriteLine("nothing in list"); 
     } 
     drawFolderView(); 
    } 

    private void CheckBox_Checked(object sender, RoutedEventArgs e) 
    { 
    } 

    private void CheckBox_Unchecked(object sender, RoutedEventArgs e) 
    { 

    } 
} 
public class User 
{ 
    public string Name { get; set; } 

    public int Age { get; set; } 

    public string Height { get; set; } 

    public bool Checked { get; set; } 

    public bool Equals(User other) { 
     if (Name.Equals(other.Name)) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
} 

從閱讀其他問題我做了CheckBox_Checked和未經檢查的方法,但我不知道如何實現它們。

Window x:Class="WpfApplication6.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:WpfApplication6" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <ListView Margin="10,10,10,98" Name="lvUsers"> 
     <ListView.View> 
      <GridView> 
       <GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Name}" /> 
       <GridViewColumn Header="Age" Width="50" DisplayMemberBinding="{Binding Age}" /> 
       <GridViewColumn Header="Height" Width="150" DisplayMemberBinding="{Binding Height}" /> 
       <GridViewColumn Width="60"> 
        <GridViewColumn.CellTemplate> 
         <DataTemplate> 
          <CheckBox Margin="-4,0,-4,0" IsChecked="{Binding MyBoolProperty}" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" DataContext="{Binding Checked}" /> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate> 
       </GridViewColumn> 
      </GridView> 
     </ListView.View> 
    </ListView> 
    <Button x:Name="button" Content="Delete" HorizontalAlignment="Left" Margin="353,243,0,0" VerticalAlignment="Top" Width="75" Click="button_Click" /> 
</Grid> 

這是一個合理的做法?關於WPF數據綁定的許多概念仍然讓我感到困惑。

回答

0

的複選框應改爲此:

<CheckBox Margin="-4,0,-4,0" IsChecked="{Binding Checked}" /> 

在DataContext對於該複選框被用戶(如它是爲其它列)。複選框的IsChecked屬性綁定到用戶的Checked屬性。

沒有必要在button_click方法中調用drawFolderView。 lvUsers.ItemsSource已經設置爲用戶。由於用戶是ObservableCollection,它會引發事件告訴WPF項目已被刪除/添加,並且您的列表視圖將自動更新。

要使用WPF最好地工作,您的User類應該實現INotifyPropertyChanged。當用戶對象的屬性發生變化時,綁定會自動更新。現在,只有listview可以改變用戶對象,所以你不會從INPC中獲得任何真正的好處。但是,如果您添加了一個循環遍歷Users並設置User.Checked = true的按鈕,那麼您需要使用INPC界面來告訴WPF User對象上的Checked屬性發生了變化,因此它可以更新GUI。

此外,InitializeComponent()應該移回到構造函數的頂部。您只希望在創建窗口時調用它。

這裏是你的代碼的更新版本有一些變化:

public partial class MainWindow : Window 
{ 
    ObservableCollection<User> Users = new ObservableCollection<User>(); 
    public MainWindow() 
    { 
     InitializeComponent(); 

     System.Console.WriteLine("main window"); 
     Users.Add(new User() { Name = "John Doe", Age = 42, Height = "6ft", Checked = false }); 
     Users.Add(new User() { Name = "Jane Doe", Age = 39, Height = "6ft", Checked = false }); 
     Users.Add(new User() { Name = "Sammy Doe", Age = 7, Height = "5ft", Checked = false }); 

     lvUsers.ItemsSource = Users; 
    } 
    private void button_Click(object sender, RoutedEventArgs e) 
    { 
     if (Users.Count > 0) 
     { 
      List<User> itemsToRemove = new List<User>(); 

      foreach (User person in Users) 
      { 
       if (person.Checked) 
       { 
        itemsToRemove.Add(person); 
       } 
      } 
      foreach (User person in itemsToRemove) 
      { 
       Users.Remove(person); 
      } 

     } 
     else 
     { 
      System.Console.WriteLine("nothing in list"); 
     } 
    } 
} 
public class User : System.ComponentModel.INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void OPC(string propertyName) // OPC = OnPropertyChanged; a helper that raises the PropertyChanged event 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    private string _name; 
    public string Name 
    { 
     get { return _name; } 
     set 
     { 
      if (_name != value) 
      { 
       _name = value; 
       OPC("Name"); 
      } 
     } 
    } 

    private int _age; 
    public int Age { get { return _age; } set { if (_age != value) { _age = value; OPC("Age"); } } } 

    private string _height; 
    public string Height { get { return _height; } set { if (_height != value) { _height = value; OPC("Height"); } } } 

    private bool _checked; 
    public bool Checked { get { return _checked; } set { if (_checked != value) { _checked = value; OPC("Checked"); } } } 

    public bool Equals(User other) 
    { 
     if (Name.Equals(other.Name)) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
} 
+0

太感謝了,你能不能推薦任何在線教程,以瞭解更多信息?我發現http://www.wpftutorial.net/和http://www.wpf-tutorial.com/是相當缺乏 – Bbb

+0

Syncfusion的免費電子書「WPF簡潔」? https://www.syncfusion.com/resources/techportal/details/ebooks/wpf –

相關問題