2016-11-11 7 views
0

ObservableStackの実装でどこが間違っているのかを指摘できますか? XAMLはスタックに含まれている情報がどのようにUIに表示されていないかに関わらず、バインドに失敗しています。 ViewModelのプロパティの型をObservableStackからObservableCollectionに変更するだけで、UI要素が表示されます。これは実装だと思います。ObservableStackに関する問題<T>実装とXAMLバインディング

私の要素がスタックオーダーではなくコレクションオーダーでUIに表示されるように、これを使用します。

事前のお手伝いがあります。

public class ObservableStack<T> : INotifyPropertyChanged, INotifyCollectionChanged, ICollection , IEnumerable<T>, IEnumerable , IReadOnlyCollection<T> 
{ 
    ObservableCollection<T> _coll = new ObservableCollection<T>(); 

    public ObservableStack() 
    { 
     _coll.CollectionChanged += _coll_CollectionChanged; 
    } 

    public ObservableStack(IEnumerable<T> items) : base() 
    { 
     foreach (var item in items) 
     { 
      Push(item); 
     } 
    } 

    private void _coll_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     OnCollectionChanged(e); 
    } 

    public void Push(T item) 
    { 
     _coll.Insert(0, item); 
    } 

    public void Pop() 
    { 
     _coll.RemoveAt(0); 
    } 

    public T Peek 
    { 
     get { return _coll[0]; } 
    } 

    public int Count 
    { 
     get 
     { 
      return ((ICollection)_coll).Count; 
     } 
    } 

    public bool IsSynchronized 
    { 
     get 
     { 
      return ((ICollection)_coll).IsSynchronized; 
     } 
    } 

    public object SyncRoot 
    { 
     get 
     { 
      return ((ICollection)_coll).SyncRoot; 
     } 
    } 

    public void CopyTo(Array array, int index) 
    { 
     ((ICollection)_coll).CopyTo(array, index); 
    } 

    public IEnumerator GetEnumerator() 
    { 
     return ((ICollection)_coll).GetEnumerator(); 
    } 

    IEnumerator<T> IEnumerable<T>.GetEnumerator() 
    { 
     return ((IEnumerable<T>)_coll).GetEnumerator(); 
    } 

    #region INotifyPropertyChanged 
    protected void OnPropertyChanged([CallerMemberName] string caller = "") 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(caller)); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    #endregion 

    #region INotifyCollectionChanged 
    public event NotifyCollectionChangedEventHandler CollectionChanged; 

    protected void OnCollectionChanged(NotifyCollectionChangedEventArgs e) 
    { 
     CollectionChanged?.Invoke(this, e); 
    } 
    #endregion 

} 
+0

"XAMLが何らかの方法でバインドするのに失敗していますか?OK、おそらくあなたが知っているように、失敗したXAMLを表示できますか? DataContextの割り当て方法は?そして、ビューモデル?最小限で、完全で、検証可能なものなど、あなたは知っていますか?あなたは、バインディング自体、またはその(意図された)ソースまたはターゲットについて正確には何も教えていません。しかし、あなたは私たちに、それが間違っていることを教えてほしい。あなたの推測は私のものと同じくらい良いです。 –

+1

技術的には、このObservableStackは、適切なフレームワークを対象とする移植可能なアセンブリに置かれた場合、WPFとUWPで動作します。 – ibebbs

+0

@ PeterTorr-MSFT、私はibebbsに同意します。両地域のSOメンバーがコメントできず、また恩恵を受けられる理由もありません。 – Cleve

答えて

0

私が見つけた解決策は、私は私のObservableStack上のIListを実装するために必要なことです。その後、すべてが期待通りに機能しました。奇妙なことに、単にIList<T>を実装しても機能しませんでした。それには非汎用インターフェースが必要でした。助けをしてくれた人たちにもう一度感謝します。

1

あなたは二コンストラクタで内部CollectionChangedハンドラをアタッチするのを忘れ:

は、ここに私の実装です。

したがって、このように(代わりに、基本クラスのコンストラクタの)他のコンストラクタを呼び出す:

public ObservableStack(IEnumerable<T> items) 
    : this() // instead of base() 
{ 
    foreach (var item in items) 
    { 
     Push(item); 
    } 
} 
+0

こんにちは、私はこれも見つけました。それを修正しましたが、違いはありません。 Ed Plunketに応えて、私はより多くの情報を与えるために編集を投稿しようとします。 – Cleve

+1

少なくとも、ObservableCollectionのPropertyChangedイベントのハンドラも登録する必要があります。 – Clemens

+0

こんにちは@クレメンス、返信いただきありがとうございます。 PropertyChangedイベントは購読できません。 – Cleve

関連する問題