2016-04-05 11 views
1

私は、そのプロパティとチェックボックスをリストする複数のオブジェクトを含むデータバインディングを使用してリストビューを表示する単純なアプリケーションを作成しようとしています。私は、ユーザーが削除したいすべてのボックスをチェックしてから、選択した要素を削除するボタンを押します。wpfアプリケーションのグリッド内のすべての値を渡すにはどうすればよいですか?

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(それは他の列にあるような)ユーザです。 CheckboxのIsCheckedプロパティは、UserのCheckedプロパティにバインドされています。

button_clickメソッドでdrawFolderViewを呼び出す必要はありません。 lvUsers.ItemsSourceはすでにUsersに設定されています。 UsersはObservableCollectionなので、アイテムが削除/追加されたことをWPFに知らせるイベントを発生させ、リストビューは自動的に更新されます。

WPFで最もうまく動作するには、ユーザークラスにINotifyPropertyChangedを実装する必要があります。ユーザーオブジェクトのプロパティが変更されると、バインディングは自動的に更新されます。今のところ、listviewだけがUserオブジェクトを変更できるので、INPCから本当の利益を得ることはできません。しかし、ユーザーをループし、User.Checked = trueを設定するボタンを追加した場合、GUIを更新できるようにUserオブジェクトのCheckedプロパティが変更されたことをWPFに伝えるためにINPCインターフェイスが必要になります。

また、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 Succinctly」? https://www.syncfusion.com/resources/techportal/details/ebooks/wpf –

関連する問題