このように定義されたListViewを持つ単純なXAMLページがあります
<ListView Margin="10" Name="lvUsers" ItemsSource="{Binding People}">
<ListView.View>
<GridView>
<GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Name}" />
<GridViewColumn Header="Age" Width="50" DisplayMemberBinding="{Binding Age}" />
<GridViewColumn Header="Mail" Width="150" DisplayMemberBinding="{Binding Mail}" />
</GridView>
</ListView.View>
</ListView>
私の背後にあるコードで:-
public ObservableCollection<Person> People { get; set; }
public ListView()
{
InitializeComponent();
this.People = new ObservableCollection<Person>();
this.People.Add(new Person() { Name = "John Doe", Age = 42, Mail = "[email protected]" });
this.People.Add(new Person() { Name = "Jane Doe", Age = 39, Mail = "[email protected]" });
this.People.Add(new Person() { Name = "Sammy Doe", Age = 7, Mail = "[email protected]" });
}
このようなコードビハインドでリストビューのItemsSourceを設定した場合
lvUsers.ItemsSource = this.People;
それは動作し、私のグリッドは期待どおりに表示されます
ただし、その行を削除してXAMLでバインドしようとすると
<ListView Margin="10" Name="lvUsers" ItemsSource="{Binding People}">
もう機能しません。
XAMLのバインディングが機能しないのはなぜですか?
たとえばXAMLでまだ実行していない場合は、バインディングにDataContext
を設定する必要があります。また、People
プロパティはINotifyPropertyChanged
を実装しないため、少なくともInitializeComponent
を設定する前に、DataContext
の前にこのリストを作成して、バインディングが評価されるときにリストが準備できていることを確認してください。 ObservableCollection
に後で追加できますが、UIに通知せずにそれ以降に作成した場合は機能しません
public ListView()
{
this.People = new ObservableCollection<Person>();
InitializeComponent();
this.DataContext = this;
this.People.Add(new Person() { Name = "John Doe", Age = 42, Mail = "[email protected]" });
this.People.Add(new Person() { Name = "Jane Doe", Age = 39, Mail = "[email protected]" });
this.People.Add(new Person() { Name = "Sammy Doe", Age = 7, Mail = "[email protected]" });
}
この行をxaml.csの既存のコードの後に配置します
this.DataContext = People;
あなたのxamlを
ItemsSource="{Binding People}"
に
ItemsSource="{Binding}"