1
<ListBox x:Name="MainList" HorizontalAlignment="Left" Height="468" Margin="10,10,0,0" VerticalAlignment="Top" Width="100" ItemsSource="{Binding Items,Mode=TwoWay}" DisplayMemberPath="Name"/>



[Serializable()]
public class MYcontainer : INotifyPropertyChanged,ISerializable
{
    private List<MYClass> _items = new List<MYClass>();
    public List<MYClass> Items
    {
        get{ return _items;}
       set { this._items =value;
        OnPropertyChanged("Items");
    }
public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged(string propertyName = null)
    {
        var eventHandler = this.PropertyChanged;
        if (eventHandler != null)
            eventHandler(this, new PropertyChangedEventArgs(propertyName));
    }  
}

「アイテム」にアイテムを追加してもUIが更新されませんが、ウィンドウを閉じて再度開くと、新しいアイテムが正しく表示されるため、バインディングは正常に機能しています。

私は何を間違っていますか?使用した場合は正常に動作することはわかってObservableCollectionいますが、動作するべきではありませんList<>か? 別のウィンドウに既に string[] プロパティがあり、正常に更新されます。

4

2 に答える 2

5

UE を使用したくない場合ObservableCollectionは、実装する必要がありますINotifyCollectionChanged

public partial class MainWindow : Window, INotifyCollectionChanged
{

    public event NotifyCollectionChangedEventHandler CollectionChanged;

    public MainWindow()
    {
        InitializeComponent();
    }


    public void NotifyCollectionChanged(NotifyCollectionChangedAction action)
    {
        if (CollectionChanged != null)
        {
            CollectionChanged(this, new NotifyCollectionChangedEventArgs(action));
        }
    }
}

ただしObservableCollection、これはすべてあなたのために行います。同じロジックをすべて追加するとList<T>、カスタムが作成されるだけObservableCollectionです。MSがすでにこれを作成している場合、これには意味がありません

于 2012-12-13T23:23:18.100 に答える
4

現在、リスト全体を新しい に置き換えた場合にのみ更新されますList<MyClass>OnPropertyChanged1 つのアイテムを交換しても、イベントはトリガーされません。

ObservableCollection<MyClass>の代わりに を使用しList<MyClass>ます。この問題を処理するために特別に構築されており、コレクション内の項目が変更されるたびに WPF に通知します。

他の点では list と非常によく似ているため、コードの変更は最小限に抑える必要があります (List と ObservableCollection の両方がICollection<T>インターフェイスを実装しているため、ほとんどのメソッドが共有されます)。

于 2012-12-13T23:06:57.293 に答える