web-dev-qa-db-ja.com

XAMLのWPF ListViewバインディングItemsSource

このように定義された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のバインディングが機能しないのはなぜですか?

14
David

たとえば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]" }); 
}
10
dkozl

この行をxaml.csの既存のコードの後に​​配置します

this.DataContext = People;

あなたのxamlを

ItemsSource="{Binding People}" 

ItemsSource="{Binding}"
5
Arushi Agrawal