2012-04-13 87 views
0

是否有任何方式更新列表框项目文本后更新它在文本框?如果可能的话,我只想用绑定来做。列表框从列表中读取,但列表不更新,所以它永远不会更改,除非我添加新项目列表。这里是代码wpf绑定列表,列表框和控件双向

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:WpfApplication1" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <DockPanel VerticalAlignment="Top" HorizontalAlignment="Left"> 
     <Button Name="dodaj" Width="40" Margin="5" Click="dodaj_Click">Dodaj</Button> 
     <Button Name="usun" Width="40" Margin=" 5" Click="usun_Click">Usuń</Button> 
    </DockPanel> 
    <DockPanel HorizontalAlignment="Left" VerticalAlignment="Center" DataContext="{Binding ElementName=lista, Path=osoba, Mode=TwoWay}"> 
     <ListBox Name="lb" ItemsSource="{Binding}" Width="200" Height="230"> 
     </ListBox> 
    </DockPanel> 
    <DockPanel HorizontalAlignment="Right" VerticalAlignment="top"> 
     <WrapPanel> 
     <StackPanel> 
     <Label>Imię</Label> 
     <Label>Nazwisko</Label> 
     <Label>Email</Label> 
     <Label>Telefon</Label> 
     </StackPanel> 
      <StackPanel DataContext="{Binding ElementName=lb, Path=SelectedItem, UpdateSourceTrigger=LostFocus}" TextBoxBase.TextChanged="zmiana"> 
       <TextBox Width="200" Margin="3" Name="imie" Text="{Binding Path=imie}"></TextBox> 
       <TextBox Width="200" Name="nazwisko" Text="{Binding Path=nazwisko}"></TextBox> 
       <TextBox Width="200" Margin="3" Name="email" Text="{Binding Path=email}"></TextBox> 
       <TextBox Width="200" Name="telefon" Text="{Binding Path=telefon}"></TextBox> 
      </StackPanel> 
     </WrapPanel> 
    </DockPanel> 
</Grid> 

using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 
using System.ComponentModel; 




namespace WpfApplication1 
{ 


/// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     lista.Add(new dane("imie1", "nazwisko1", "email1", "tel1")); 
     lista.Add(new dane("imie2", "nazwisko2", "email2", "tel2")); 
     lb.DataContext = lista; 
    } 
    public class dane : INotifyPropertyChanged 
    { 
     public dane(string imie, string nazwisko, string email, string telefon) 
     { 
      this._imie = imie; 
      this.nazwisko = nazwisko; 
      this.osoba = nazwisko + " " + imie; 
      this.email = email; 
      this.telefon = telefon; 

     } 
     private string _imie; 
     public string imie 
     { 
      set 
      { 
       _imie = value; 
       OnPropertyChanged("Imie"); 
      } 
      get 
      { 
       return _imie; 
      } 
     } 
     public string nazwisko { set; get; } 
     public string osoba { set; get; } 
     public string email { set; get; } 
     public string telefon { set; get; } 
     public override string ToString() 
     { 
      return osoba; 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     private void OnPropertyChanged(string value) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(value)); 
      } 
     } 

    } 
    public ObservableCollection<dane> lista = new ObservableCollection<dane>(); 

    //public List<dane> lista = new List<dane>(); 
    /*public ObservableCollection<dane> lista 
    { 
     get { return (ObservableCollection<dane>)GetValue(listaProperty); } 
     set { SetValue(listaProperty, value); } 
    } 

    public static readonly DependencyProperty listaProperty = 
     DependencyProperty.Register("lista", typeof(ObservableCollection<dane>), typeof(Window), new UIPropertyMetadata(null)); 
    */ 
    private void dodaj_Click(object sender, RoutedEventArgs e) 
    { 
     lista.Add(new dane("...", "", "", "")); 
     MessageBox.Show(lista[0].ToString()); 

    } 

    private void usun_Click(object sender, RoutedEventArgs e) 
    { 
     lista.RemoveAt(lb.SelectedIndex); 
    } 
} 

}

回答

0

列表框由他们的ToString()表示显示您的丹​​麦类的实例。您应该直接使用DisplayMemberPath将列表框绑定到osoba属性。而且osoba财产的价值也没有改变,那么你改变imia和nazwisko。你应该重新计算它的吸气,并提高属性改变(“osoba”),然后属性nazwisko或imia正在改变。

+0

一切都很完美!谢谢!我知道这是一个简单的错误,但我无法找到它。再次感谢您。 – lisek 2012-04-14 11:41:38