2013-03-07 86 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"); } 
    } 

    ...