2017-01-12 2 views
-1

Ich erstelle ein N-Tier-WPF-MVVM-Projekt. Ich möchte eine Liste von Elementen aus der Datenbank abrufen, die in einer Listbox angezeigt werden sollen. Ich möchte das Listenfeld an eine Eigenschaft im ViewModel (VM) binden. Das Problem ist, die Bindung funktioniert bei mir nicht, die Listbox ist immer leer. Wenn ich einen Haltepunkt auf "Rücksende-Tags" setze, wird es vollständig ausgefüllt, bevor das Formular angezeigt wird.WPF Listbox Bindungsprobleme

Die DataContext = App.ViewModel; im MainWindow() - Konstruktor.

In meiner XAML

<ListBox ItemsSource="{Binding Tags, Mode=OneWay}" Height="161" HorizontalAlignment="Left" Margin="236,6,0,0" Name="lstTags" VerticalAlignment="Top" Width="130" > 
      <ListBox.ItemTemplate> 
        <DataTemplate> 
         <StackPanel Orientation="Vertical"> 
          <TextBlock Text="{Binding Tags.Name}" /> 
          <TextBlock Text="{Binding Tags.Description}" /> 
          <!--<CheckBox IsChecked="{Binding Deleted, Mode=TwoWay}"/>--> 
         </StackPanel> 
        </DataTemplate> 
      </ListBox.ItemTemplate> 
    </ListBox> 

In meiner VM: Wenn ich einen Haltepunkt setzen auf "return-Tags" es ist voll bestückt.

private TagCol _tags; 
public TagCol Tags 
{ 
    get { 
     TagColData tcd = new TagColData(); 
     _tags = tcd.LoadAll(); 

     //NotifyPropertyChanged("Tags"); 

     return _tags; 
    } 
    set { 
     _tags = value; 
     NotifyPropertyChanged("Tags"); 
    } 
} 

TagCol:

public class TagCol { privat ObservableCollection _tagCol = new ObservableCollection();

/// <summary>Collection (list) of Tag objects</summary> 
public ObservableCollection<Tag> Collection { 
    get { return _tagCol; } 
    set 
    { 
     _tagCol = value; 
    } 
} 

public TagCol() 
{ 

} 

}

+0

Haben Sie den DataContext des MainWindow (oder eines übergeordneten Steuerelements der ListBox) auf eine Instanz Ihrer Ansichtsmodellklasse gesetzt? – Clemens

+0

könnten Sie bitte die Definition von 'TagCol' –

+0

Verwenden Sie Snoop, um die Bindungen und die Steuerelemente zur Laufzeit zu untersuchen. TagCol muss IEnumerable implementieren, damit dies funktioniert. – Will

Antwort

0

Jungs war es natürlich in der Bindung, es benötigt, um Tags.Collection Übrigens eingestellt werden, in den Unter Eigenschaften für die Textfelder Collection.Name wird nicht funktionieren.

Nun, das brauchte ein paar Tage Freizeit! :)

 <ListBox ItemsSource="{Binding Tags.Collection}" Height="161" HorizontalAlignment="Left" Margin="236,6,0,0" Name="lstTags" VerticalAlignment="Top" Width="130" > 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Vertical"> 
         <TextBlock Text="{Binding Path=Name}" /> 
         <TextBlock Text="{Binding Path=Description}" /> 
         <CheckBox IsChecked="{Binding Deleted, Mode=TwoWay}"/> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox>