3

以下に示すようなクラスがあります。簡潔にするために削除したすべての機能

public class PersonCollection:IList<Person>
{}

以下に示すように、もう 1 つの Model クラスがあります。AddValueCommand は ICommand から派生したクラスですが、これも省略しています。

public class DataContextClass:INotifyCollectionChanged
{
    private PersonCollection personCollection = PersonCollection.GetInstance();

    public IList<Person> ListOfPerson
    {
        get 
        {
            return personCollection;
        }            
    }

    public void AddPerson(Person person)
    {
        personCollection.Add(person);
        OnCollectionChanged(NotifyCollectionChangedAction.Reset);
    }


    public event NotifyCollectionChangedEventHandler CollectionChanged = delegate { };
    public void OnCollectionChanged(NotifyCollectionChangedAction action)
    {
        if (CollectionChanged != null)
        {
            CollectionChanged(this, new NotifyCollectionChangedEventArgs(action));
        }
    }       

    ICommand addValueCommand;

    public ICommand AddValueCommand
    {
        get
        {
            if (addValueCommand == null)
            {
                addValueCommand = new AddValueCommand(p => this.AddPerson(new Person { Name = "Ashish"}));
            }
            return addValueCommand;               
        }
    }
}

メイン ウィンドウで、以下に示すように UI をモデルにバインドしています。

 DataContextClass contextclass = new DataContextClass();           
 this.DataContext = new DataContextClass();

そして、私のUIは以下のようになります

<ListBox Margin="5,39,308,113" ItemsSource="{Binding Path=ListOfPerson}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBox Height="20" Text="{Binding Path=Name}"></TextBox>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    <Button Content="Button"  HorizontalAlignment="Left" Command="{Binding Path=AddValueCommand}" Margin="233,39,0,73" />

ボタンをクリックしても、リスト ボックスが新しい値で更新されません。私がここに欠けているもの。

4

2 に答える 2

11

INotifyCollectionChangedコレクションクラスで実装する必要があります。 コレクションを含むクラスごとではありません。から削除してから追加する
必要があります。INotifyPropertyChangedDataContextClassPersonCollection

于 2013-04-30T10:47:02.197 に答える
10

IList使用する代わりに、クラスを以下のようObservableCollection<T>に定義します。PersonCollection

public class PersonCollection : ObservableCollection<Person>
{}

WPF DataBinding シナリオでのコレクション変更通知用に特別に設計されたObservableCollection<T>クラスの詳細については、こちらを参照してください。

以下のMSDNの定義からわかるように、既に実装されています。INotifyCollectionChanged

public class ObservableCollection<T> : Collection<T>, 
    INotifyCollectionChanged, INotifyPropertyChanged

WPF での ObservableCollection クラスの使用に役立つその他の記事を以下に示します。

ObservableCollection の作成とバインド
Wpf での ObservableCollection の概要
MVVM でのObservableCollection のデータバインド

于 2013-04-30T10:50:08.157 に答える