2016-06-25 5 views
1

Ich habe einige Probleme mit XAML-Syntax, ich kann nicht verstehen, was ich falsch mache.XAML ListView Binding

Ich habe ein einfaches Fenster mit einem ListView-Steuerelement und ein einfaches ViewModel mit einer ObservableCollection von Elementen.

Der DataContext des Fensters ist korrekt eingestellt, aber mein Problem ist mit der ItemsSource-Eigenschaft der ListView, wenn ich debud der App kann ich sehen, dass die ListView das DataContext Recht hat und dass der DataContext eine Liste mit Items hat.

Aber die Eigenschaft ItemsSource ist Null, wenn ich es in Code hinter es funktioniert gut eingestellt.

Ich habe nach einer Antwort gesucht, aber ich kann keine finden, einige Post scheint das gleiche Problem zu haben, aber es war immer der Datenkontext.

Hier ist mein Code.

XAML

<Window x:Class="XAMLExamples.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:XAMLExamples" 
     xmlns:vm="clr-namespace:XAMLExamples.ViewModels" 
     mc:Ignorable="d" 
     Title="Ejemplos XAML" Height="350" Width="525" Background="#FF38551F" WindowStyle="ToolWindow" 
     > 
    <Window.DataContext> 
     <vm:TractoViewModel/> 
    </Window.DataContext> 

    <Grid > 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"> 
      </RowDefinition> 
     </Grid.RowDefinitions> 
     <ListView ItemsSource="{Binding Path=listaAreas}" Grid.Column="0" x:Name="ListAreas"> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn Header="Area" Width="120" DisplayMemberBinding="{Binding Area}"/> 
        <GridViewColumn Header="Contenedores" Width="120" DisplayMemberBinding="{Binding Contenedores}"/> 
       </GridView> 
      </ListView.View> 
     </ListView> 
    </Grid> 
</Window> 

C#

namespace XAMLExamples.ViewModels 
{ 
    public class TractoViewModel 
    { 
     public ObservableCollection<TractoModel> listaAreas = new ObservableCollection<TractoModel>(); 
     public TractoViewModel() 
     { 
      for (int i = 0; i < 10; i++) 
      { 
       listaAreas.Add(
        new TractoModel { Area= string.Format("Area {0}",i), Contenedores=i} 
        ); 
      } 
      return; 
     } 
    } 
} 
public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      // With the following line everything is right 
      // this.ListAreas.ItemsSource = new XAMLExamples.ViewModels.TractoViewModel().listaAreas; 
      // Without the above line ItemsSource is null, even when the DataContext is right 
      var iSource = ListAreas.ItemsSource; 
      if (iSource == null) return; 

     } 
    } 
+0

Zeigen Sie uns die Struktur der 'listaAreas'. Es geht nicht nur um "how-to-bind", sondern auch um "what-to-bind". – C4u

+0

Ich kann Ihren Datenkontext nicht im Hauptfenster sehen hits.DataContext = new TractoViewModel(); – SeeuD1

Antwort

2

Daten in WPF Bindung mit öffentlichen Eigenschaften arbeitet, keine Felder.

So müssen Sie Ihre listaAreas Feld in eine Eigenschaft, z. dies wie:

public class TractoViewModel 
{ 
    public ObservableCollection<TractoModel> listaAreas { get; private set; } 
     = new ObservableCollection<TractoModel>(); 

    ... 
} 

Entsprechend einer weit C# Namenskonvention angenommen, sollte der Name der Eigenschaft auch mit einem Großbuchstaben beginnen:

public ObservableCollection<TractoModel> ListaAreas { get; private set; } 
+0

Wenn Sie den Sammlungsnamen ändern, vergessen Sie nicht, es auch in der XAML zu ändern;) –

+0

Sie haben absolut Recht, mein Problem war, dass ich ein Feld anstelle einer Eigenschaft hatte, änderte ich einfach die Zeile: öffentliche ObservableCollection ListaAreas {bekommen; einstellen; } = new ObservableCollection (); Und jetzt kann ich sogar die Liste im Designer sehen. Ich schätze wirklich deine Hilfe, es zeigte mir wirklich, dass ich über die Grundlagen und wie Dinge funktionieren sollten anstatt zu denken, dass etwas anderes falsch ist. Danke auch an @ SeeuD1 @ C4u –

+0

Wenn die Antwort hilfreich war, bitte überlege es zu akzeptieren. Siehe die Hilfe-Seite [Was soll ich tun, wenn jemand meine Frage beantwortet?] (Http://stackoverflow.com/help/someone-answers). – Clemens