2016-06-25 6 views
1

XAML構文にいくつか問題がありますが、私が間違っていることを突き止めることはできません。XAML ListViewバインド

私は、ListViewコントロールを備えた単純なウィンドウと、ObservableColletionアイテムを持つ単純なViewModelを持っています。

WindowのDataContextは正しく設定されていますが、問題はListViewのItemsSourceプロパティにあります。アプリケーションをデバッグすると、ListViewにDataContext権限があり、DataContextにItemsがリストされていることがわかります。

しかし、プロパティItemsSourceはNULLです。これをコード内に設定すると、うまく機能します。

私は答えを探しましたが、見つけられませんでした。いくつかの投稿には同じ問題があるようですが、それは常にdatacontextでした。

ここに私のコードです。 WPFに結合

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

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

広く受け入れられているC#の命名規則によると、プロパティ名も大文字で始める必要があります。それは 'how-to-bind'だけでなく' what-to-bind'についても同様です。 – C4u

+0

mainwindowであなたのdatacontextを試すことができませんhits.DataContext = new TractoViewModel(); – SeeuD1

答えて

2

データのパブリックプロパティではなく、フィールドで動作します。

フィールドをlistaAreasフィールドに変更する必要があります。このように:私たちは `listaAreas`の構造を表示

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

コレクション名を変更するときは、XAMLでも同様に変更することを忘れないでください; –

+0

あなたは本当に正しいです、私の問題はプロパティの代わりにフィールドを持っていたことでした。 ListaAreas {get;セット; } =新しいObservableCollection (); これでデザイナーのリストが表示されるようになりました。 私はあなたの助けを本当に感謝しています。何かが間違っていると思うのではなく、基本について考えなければならないと思っています。 @ SeeuD1 @ C4uにも感謝します –

+0

答えが役に立ったら、それを受け入れることを検討してください。ヘルプセンターのページ[誰かが私の質問に答えるときに私は何をすべきですか?](http://stackoverflow.com/help/someone-answers)を参照してください。 – Clemens

関連する問題