2013-03-07 52 views
0

我是wpf的新手,我正在尝试使用网格并添加减法,将元素移除到最终绑定到网格的数据库表。如何使用可观察的集合和notifproroperty已更改

因此,从网格中选择,更新可观察集合,刷新。

我无法理解如何使用可观察集合的更改通知。

这是我的代码

类结合到电网

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

代码}

原谅任何愚蠢的错误..

+1

究竟是什么问题了吗? – 2013-03-07 17:03:28

+1

为什么你的可观察集合命名为STD?这只是错误xD – 2013-03-07 17:48:13

回答

2

有一个在这里问题coulpe,你不应该有来自码触摸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您​​收集和SelectedResult

<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项目将被改变。

现在,要添加和删除ListView中的项目,您只需添加和删除​​集合(StudentModel.std)。

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

注:这个事件处理程序应该是一个ICommand约束力,但我会让你的搜索该:)

这里是一个完整的示例THA希望有助于解释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> 

我希望这个信息可以帮助:)

+0

谢谢!你的辉煌.. – 2013-03-08 16:44:09

1

好吧第一,我很抱歉,如果我做的不好回答这个问题。这是我第一次尝试。

所以看起来你已经有了正确的想法,而且你所拥有的大部分工作都会发挥作用。但看起来你可能忘记实施INotifyPropertyChanged。你可能会考虑使用诸如List<GetStudent_Result>之类的东西,代价比ObservableCollection少很多,因为你会自己实现NotifyPropertyChanged。

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

    ...