2009-11-19 3 views
0

J'ai une liste <> d'objets que j'ai liés à un ListBox. Je veux ensuite lier les propriétés de SelectedValue à divers TextBox. Le comportement est très vilain cependant. Lors de la liaison du nom (une chaîne) utilisé comme DisplayMember pour le contrôle ListBox, il ne met pas à jour le contrôle ListBox et si j'essaie d'actualiser la liaison sur l'événement TextChanged, il ne met pas à jour jusqu'à la sélection changements, puis il a des problèmes de commutation de la sélection. Lors de la liaison Balance (une décimale), il les modifie tous (ou, éventuellement, le changement est appliqué lorsque je change la sélection, mais il est en train de changer les données, pas seulement de ne pas mettre à jour). Pour être clair, j'utilise C# .NET et non pas ASP.C#: Lier TextBox à SelectedValue

+0

Pouvez-vous poster du code? Votre liste contient-elle des objets dérivés de INotifyPropertyChanged? – lesscode

+1

Aussi: Silverlight, WinForms ou WPF? –

+0

Je ne sais pas ce que j'utilise (Silverlight, WinForms, WPF). Je pense que c'est WinForms. voici comment je lie nameTxb.DataBindings.Add ("Text", accountsLsb, "SelectedValue.Name"); et ne met pas à jour la liste. Il met à jour les données réelles mais vous devez changer la sélection pour l'obtenir pour mettre à jour le nom dans la liste. –

Répondre

1

En supposant WPF, un échantillon rapide:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition /> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 
     <ListBox x:Name="list" 
       ItemsSource="{Binding}" 
       DisplayMemberPath="Name"/> 
     <TextBox Text="{Binding ElementName=list, Path=SelectedItem.Name}" 
       Grid.Row="1"/> 
     <TextBox Text="{Binding ElementName=list, Path=SelectedItem.Val}" 
       Grid.Row="2" /> 
    </Grid> 
</Window> 

namespace WpfApplication1 { 
    public class Thing : INotifyPropertyChanged { 
     private string _name; 
     private double _val; 

     public string Name { 
      get { return _name; } 
      set { 
       _name = value; 
       OnPropertyChanged("Name"); 
      } 
     } 

     public double Val { 
      get { return _val; } 
      set { 
       _val = value; 
       OnPropertyChanged("Val"); 
      } 
     } 

     protected void OnPropertyChanged(string propertyName) { 
      PropertyChangedEventHandler propertyChanged = this.PropertyChanged; 
      if (propertyChanged != null) { 
       propertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
    } 

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

      DataContext = new List<Thing> { new Thing { Name = "A", Val = 1.0 }, new Thing { Name = "B", Val = 2.0 } }; 
     } 
    } 
} 
0

Je trouve la solution à Switch on the Code. Fondamentalement, j'ai besoin d'utiliser la collection BindingList au lieu de simplement List.