2016-04-05 2 views
1

Ich versuche, eine einfache Anwendung zu schreiben, wo ich eine Listenansicht mit Datenbindung anzeigen, die mehrere Objekte enthält, die ihre Eigenschaften und ein Kontrollkästchen enthält. Ich lasse den Benutzer alle Kästchen markieren, die entfernt werden sollen, und drücke dann eine Taste, die die ausgewählten Elemente entfernt.Wie übertrage ich alle Werte in einem Raster in einer WPF-Anwendung?

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

von den anderen Fragen zu lesen habe ich die CheckBox_Checked und ungeprüfte Methoden, aber ich habe keine Ahnung, wie sie umgesetzt werden.

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> 

Ist dies ein sinnvoller Ansatz? Viele der Konzepte, die die Datenbindung in WPF betreffen, verwirren mich immer noch.

Antwort

0

Die Checkbox sollte dies geändert werden:

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

Die Datacontext für die Checkbox ist der Nutzer (wie es für die anderen Spalten ist). Die IsChecked-Eigenschaft der Checkbox ist an die Checked-Eigenschaft des Benutzers gebunden.

Es ist nicht notwendig, drawFolderView in der button_click-Methode aufzurufen. Die lvUsers.ItemsSource ist bereits auf Benutzer festgelegt. Da es sich bei "Benutzer" um eine ObservableCollection handelt, werden Ereignisse ausgelöst, die WPF mitteilen, dass Elemente entfernt/hinzugefügt wurden und dass sich Ihr Listenansicht automatisch aktualisiert.

Um mit WPF am besten zu funktionieren, sollte Ihre Benutzerklasse INotifyPropertyChanged implementieren. Wenn sich die Eigenschaften von Benutzerobjekten ändern, werden Ihre Bindungen automatisch aktualisiert. Im Moment kann nur die Listenansicht die Benutzerobjekte ändern, sodass Sie von INPC keinen wirklichen Nutzen erhalten. Wenn Sie jedoch eine Schaltfläche hinzugefügt haben, die die Benutzer durchlaufen hat und User.Checked = true festgelegt hat, müsste die INPC-Schnittstelle WPF mitteilen, dass die Checked-Eigenschaft der Benutzerobjekte geändert wurde, damit die GUI aktualisiert werden kann.

Außerdem sollte InitializeComponent() zurück an den Anfang des Konstruktors verschoben werden. Das wollen Sie nur, wenn das Fenster erstellt wird. Hier

ist eine aktualisierte Version des Codes mit ein paar Änderungen:

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

Vielen Dank, könnten Sie alle Online-Tutorials empfehlen Sie mehr zu erfahren? Ich habe gefunden http://www.wpftutorial.net/ und http://www.wpf-tutorial.com/, um ganz zu fehlen – Bbb

+0

Syncfusion ist kostenlos E-Book "WPF Succinctly"? https://www.syncfusion.com/resources/techportal/details/ebooks/wpf –