0

私はwpfが初めてで、現在グリッドで遊んで、最終的にグリッドにバインドされるdbテーブルに要素を削除、削除しようとしています。

したがって、グリッドから選択し、監視可能なコレクションを更新し、更新します。

監視可能なコレクションの変更通知を使用する方法を理解できていません。

これが私のコードです

グリッドにバインドするクラス

  public class students
{
   ObservableCollection<GetStudents_Result> stdb = new ObservableCollection<GetStudents_Result>();



   //public event NotifyCollectionChangedEventHandler CollectionChanged;


   public students()
   {


       AbcdEntities abcdEnt=new AbcdEntities();

       List<GetStudents_Result> studentColl = abcdEnt.GetStudents().ToList();
       foreach (var item in studentColl)
       {
           stdb.Add(item);
       }
   }

   //public  void onCollectionChange(object sender,NotifyCollectionChangedEventHandler e)
   //{

   //}

   public ObservableCollection<GetStudents_Result> std {get {return stdb;}}
}

私のxaml。

 <Canvas>
    <TextBox Height="23" Canvas.Top="5" Canvas.Left="10" HorizontalAlignment="Left" Margin="10,10,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" />
    <TextBox Height="23" Canvas.Top="30" Canvas.Left="10" HorizontalAlignment="Left" Margin="10,10,0,0" Name="textBox2" VerticalAlignment="Top" Width="120" />
    <Button Canvas.Left="90" Canvas.Top="65" Content="Remove" Click="button2_Click" Height="23" Name="button2" Width="75" />
    <Button Canvas.Left="10" Canvas.Top="65" Content="Save" Height="23" Name="button1" Width="75" Click="button1_Click" />

    <ListView Name="listviewStudents" Canvas.Top="100" ItemsSource="{Binding std}" SelectionChanged="ListView_SelectionChanged">
        <ListView.View>
            <GridView>                     
                <GridViewColumn Header="fname" DisplayMemberBinding="{Binding Path=fname}"></GridViewColumn>
                <GridViewColumn Header="lname" DisplayMemberBinding="{Binding Path=lname}"></GridViewColumn>
                <GridViewColumn DisplayMemberBinding="{Binding Path=address}"></GridViewColumn>
                <GridViewColumn DisplayMemberBinding="{Binding Path=phno}"></GridViewColumn>
                <GridViewColumn DisplayMemberBinding="{Binding Path=radio}"></GridViewColumn>

            </GridView>

        </ListView.View>

    </ListView>

</Canvas>

私のコードビハインド

public MainWindow()
    {
        InitializeComponent();
        students std = new students();
        this.DataContext = std;
    }

    private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {

        GetStudents_Result selectedItem = listviewStudents.SelectedItem as GetStudents_Result;
        textBox1.Text = selectedItem.fname;
        textBox2.Text = selectedItem.lname;


    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        GetStudents_Result selecteditem = listviewStudents.SelectedItem as GetStudents_Result;
        selecteditem.fname = textBox1.Text;
        selecteditem.lname = textBox2.Text;
        listviewStudents.Items.Refresh();
    }

    private void button2_Click(object sender, RoutedEventArgs e)
    {
        listviewStudents.Items.Remove(listviewStudents.SelectedItem);
        listviewStudents.Items.Refresh();
    }
}

}

愚かな間違いを許してください..

4

2 に答える 2

2

UIここにはいくつかの問題があります。コード ビハインドからコントロールに触れる必要はありません。データ バインディングを使用する必要があります。

これは、投稿に基づくモデル バインディングの実例です。

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public MainWindow()
    {
        InitializeComponent();

        // set the DataContext to the code in this window
        this.DataContext = this;

        // create youe Student model
        StudentModel = new students();
    }


    // Create a public property of your student Model
    private students _studentModel;
    public students StudentModel
    { 
        get { return _studentModel; }
        set { _studentModel = value; NotifyPropertyChanged("StudentModel"); }
    }

    // create a public property to use as the selected item from your models "std" collection
    private GetStudents_Result _selectedResult;
    public GetStudents_Result SelectedResult 
    {
        get { return _selectedResult; }
        set { _selectedResult = value; NotifyPropertyChanged("SelectedResult"); }
    }


    private void button2_Click(object sender, RoutedEventArgs e)
    {
        // if you want to remove an item you just have to remove it from
        // the model, the INotifyPropertyChanged interface will notify the UI
        // to update, no need to call Refresh, same works for Add etc
        StudentModel.std.Remove(SelectedResult);
    }


    public event PropertyChangedEventHandler PropertyChanged;
    public void NotifyPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}

これで、をコレクションにxamlバインドできListViewます。StudentModelSelectedResult

  <ListView ItemsSource="{Binding StudentModel.std}" SelectedItem="{Binding SelectedResult}" >

TextBoxesバインドできるSelectedResultため、詳細が更新されます

注:この例では、テキストが変更されたときに SelectedResult を更新します。これは必要に応じて変更できます。

<TextBox Text="{Binding SelectedResult.Fname, UpdateSourceTrigger=PropertyChanged}" />
<TextBox Text="{Binding SelectedResult.Lname, UpdateSourceTrigger=PropertyChanged}" />

したがって、これらからアイテムを選択すると、ListViewこれらTextBoxesが入力され、それらが変更されると、SelectedResultアイテムが変更されます。

でアイテムを追加および削除するには、コレクション (StudentModel.std)ListViewに追加および削除するだけです。StudentModel

private void button2_Click(object sender, RoutedEventArgs e)
{
    StudentModel.std.Remove(SelectedResult);
}

注:このイベント ハンドラーはICommandバインディングである必要がありますが、その検索を許可します :)

これは、うまくいけばの基本を説明するのに役立つ完全な例ですWPF MVVM

コード:

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;
        StudentModel = new students();
    }

    private students _studentModel;
    public students StudentModel
    { 
        get { return _studentModel; }
        set { _studentModel = value; NotifyPropertyChanged("StudentModel"); }
    }

    private GetStudents_Result _selectedResult;
    public GetStudents_Result SelectedResult 
    {
        get { return _selectedResult; }
        set { _selectedResult = value; NotifyPropertyChanged("SelectedResult"); }
    }

    private void button2_Click(object sender, RoutedEventArgs e)
    {
        StudentModel.std.Remove(SelectedResult);
    }

    public event PropertyChangedEventHandler PropertyChanged;
    public void NotifyPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}

public class students
{
    public students()
    {
        std = new ObservableCollection<GetStudents_Result>();
        for (int i = 0; i < 100; i++)
        {
            std.Add(new GetStudents_Result { Fname = "FirstName" + i, Lname = "LasrName" + i });
        }
    }
    public ObservableCollection<GetStudents_Result> std { get; set; }
}

public class GetStudents_Result : INotifyPropertyChanged
{
    private string _fname;
    private string _lname;

    public string Fname
    {
        get { return _fname; }
        set { _fname = value; NotifyPropertyChanged("Fname"); }
    }

    public string Lname
    {
        get { return _lname; }
        set { _lname = value; NotifyPropertyChanged("Lname"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    public void NotifyPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}

Xaml:

 <Canvas>
    <TextBox Text="{Binding SelectedResult.Fname, UpdateSourceTrigger=PropertyChanged}" />
    <TextBox Text="{Binding SelectedResult.Lname, UpdateSourceTrigger=PropertyChanged}" />
    <Button Canvas.Left="90" Canvas.Top="65" Content="Remove" Click="button2_Click" Height="23" Name="button2" Width="75" />
    <Button Canvas.Left="10" Canvas.Top="65" Content="Save" Height="23" Name="button1" Width="75"  />
    <ListView Name="listviewStudents" Canvas.Top="100" ItemsSource="{Binding StudentModel.std}" SelectedItem="{Binding SelectedResult}" >
        <ListView.View>
            <GridView>
                <GridViewColumn Header="fname" DisplayMemberBinding="{Binding Path=Fname}"></GridViewColumn>
                <GridViewColumn Header="lname" DisplayMemberBinding="{Binding Path=Lname}"></GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>
</Canvas>

この情報が役立つことを願っています:)

于 2013-03-07T20:59:31.493 に答える
1

まず、これに答えるのが下手だったら謝ります。初めての試みです。

あなたは正しい考えを持っているように見えます。あなたが持っているもののほとんどはうまくいくでしょう。しかし、実装するのを忘れているようですINotifyPropertyChanged。NotifyPropertyChangedList<GetStudent_Result>を自分で実装するため、ObservableCollection よりもオーバーヘッドがはるかに少なくてすみます。

public class students : INotifyPropertyChanged
{

    #region PropertyChanged EventHandler
    public event PropertyChangedEventHandler PropertyChanged;

    void NotifyPropertyChanged(String Property)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(Property));
    }
    #endregion

    private List<GetStudents_Result> stdb;
    public List<GetStudents_Result> std
    {
        get { return stdb; }
        set { stdb = value; NotifyPropertyChanged("std"); }
    }

    ...
于 2013-03-07T18:11:12.723 に答える