2016-05-15 16 views
0

Ich bin neu bei WPF Binding. Gibt es eine Möglichkeit, die Listview automatisch aktualisiert, wenn eines der Elemente in ItemSource seine eigene abhängige Eigenschaft ändert. Ich habe es mit FreezableCollection versucht.Automatische Aktualisierung von ListView-Elementen

Mein Code ist unten angegeben und das Ziel ist es, das Listenfeld zu aktualisieren, wenn das Textfeld geändert wird.

MainWindow.xaml

<Grid x:Name="mainDataGrid"> 
    <StackPanel Orientation="Horizontal"> 
     <ListView x:Name="membersListView" ItemsSource="{Binding}" MinWidth="100"/> 
     <StackPanel> 
      <TextBox x:Name="selectedItemTextBox" Text="{Binding ElementName=membersListView, Path=SelectedItem.Name, Mode=TwoWay}" MinWidth="200"/> 
     </StackPanel> 
    </StackPanel> 
</Grid> 

MainWindow.cs

public partial class MainWindow : Window 
{ 
    ViewModel vm; 
    public MainWindow() 
    { 
     InitializeComponent(); 
     vm = new ViewModel(); 
     vm.Add(new Model() { Name = "Name1" }); 
     vm.Add(new Model() { Name = "Name2" }); 
     this.DataContext = vm; 
    } 
} 
public class Model : Freezable 
    { 
     public String Name 
     { 
      get { return (String)GetValue(NameProperty); } 
      set { SetValue(NameProperty, value); } 
     } 
     public override string ToString() 
     { 
      return Name; 
     } 
     // Using a DependencyProperty as the backing store for Name. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty NameProperty = 
      DependencyProperty.Register("Name", typeof(String), typeof(Model), new PropertyMetadata("")); 

     protected override Freezable CreateInstanceCore() 
     { 
      return new Model(); 
     } 
    } 
    public class ViewModel : FreezableCollection<Model> 
    { 

    } 

Antwort

1

Ok, Gerade jetzt Ihre Listview die Stringdarstellung Ihrer Modelle zeigt, das ist, warum Sie hatte die „ToString außer Kraft zu setzen () "Methode ... weil Sie es nicht verstehen konnten, die Eigenschaft Name zu zeigen.

Nun, was passiert ist, dass Ihr TextBox ändert die Eigenschaft Name gut, aber Ihr listbox nicht weiß, dass „Name“ Eigenschaft hat sich geändert ... weil es bei ToString suchen ist()

Wenn Sie die " DisplayMemberPath“Ihrer Listview‚Name‘, wird es nicht an ToString aussehen(), aber eher‚Name‘... wie folgt aus:

<ListView x:Name="membersListView" ItemsSource="{Binding}" DisplayMemberPath="Name" MinWidth="100"/> 

Beachten Sie, dass in diesem Modus, wenn Sie die Eigenschaft Name ändern mit Textbox, die Textbox wird den Wert von "Name" Eigenschaft nicht sofort aktualisieren, bis es verliert Fokus, so zu fixieren, dass die Bindung von Textbox Text dies ändern:

<TextBox x:Name="selectedItemTextBox" Text="{Binding ElementName=membersListView, Path=SelectedItem.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" MinWidth="200"/> 

I „Update = Property“ hinzugefügt haben, um sicherzustellen, wie Sie den Text ändern von TextBox starten, wird die Eigenschaft Name sofort aktualisiert .

:) hoffe, es hilft.

Verwandte Themen