2016-11-15 8 views
1

WPFが新しく、データを単純なListBoxにバインドする際に問題があります。私は私がShowListと呼ばれる表示オブジェクトののObservableCollectionするItemsSourceプロパティを設定し、背後にあるコードで、その後 WPFリストボックスのバインディングが表示されない

<ListBox Name="lbxShows" /> 

MainWindow.XAML

でそれを設定しました。これは実際にはOasisInstがインスタンス(MainApplicationのコンストラクターでの設定)である別のクラス(Oasis)のプロパティです。

InitializeComponent(); 
mainApp = new MainApplication(); 
lbxShows.ItemsSource = mainApp.OasisInst.ShowList; 

この時点で、ShowListにはアイテムはありませんが、後で追加されるものもあり、ListBoxには表示されません。

Oasisクラスのコードは、INotifyPropertyChangedインターフェイスを実装し、ShowList設定ツールから呼び出されるテキストブックメソッドを持っています。

private void NotifyPropertyChanged([CallerMemberName] string propertyName = "") 
{ 
    if (PropertyChanged != null) 
    { 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

PropertyChangedは、PropertyChangedEventHandlerイベントです。

デバッグモードでステップスルーすると、PropertyChangedがnullになるので、自分のイベントを購読していないようです。これは通常、バインディング(私は思う?)を介して自動的に起こることを考えれば、バインディングが正しく設定されていないと推測しています。

ItemsSourceプロパティだけを設定するだけでは、バインドをセットアップするには不十分ですか?

+0

_ "Oasisクラス用のコードはINotifyPropertyChangedインターフェイスを実装しています" _ - ShowList'プロパティの値を変更しない限り、これは無関係です。 'ShowList'プロパティの値を変更する、つまり新しいコレクション全体を作成し、プロパティ値をそのコレクションを参照するように設定すると、インターフェイスを実装するだけでは不十分です。実際には、プロパティを単に設定するのではなく、ターゲットの 'ItemsSource'プロパティに実際にバインドする必要があります。通常、これはXAMLで行われますが、あなたが主張している場合はコードビハインドで行うこともできます。 –

+1

良い[mcve]がなければ、コードがうまくいかない理由を正確に知ることができないため、あなたの質問は正当な理由ではありません。あなたの質問を修正してください。 –

答えて

0

ObservableCollectionをバインドしてU/Iに更新を受け取るだけで十分です。 BindingObjectの使用を提案するつもりはないと思っていましたが、動作していました。 (だから私も何かを学んだ)。 ここでは、提供したXamlで動作する簡単な例を示します。 1秒に1回、リストにエントリを追加します。

"PropertyChangedは私のPropertyChangedEventHandlerイベントです"と言われると混乱します。必要なPropertyChangedEventHandlerはOasisオブジェクトの内部にあることに注意してください。

おそらく、あなたのMainWindowにPropertyChangedEventHandlerが必要ですが、Oasisオブジェクト内のPropertyChangedEventHandlerとのやりとりがない、あなたのU/I上に他のコントロールがあることを意味します。

----以下のコード----

using System; 
using System.Collections.ObjectModel; 
using System.ComponentModel; 
using System.Runtime.CompilerServices; 
using System.Windows; 
using System.Windows.Threading; 

namespace ListBoxTest 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    /// 

    public class OasisInstance : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     ObservableCollection<string> _items = new ObservableCollection<string>(); 
     public ObservableCollection<string> ShowList 
     { 
      get { return _items; } 
      set { 
       if (_items != value) 
       { 
        _items = value; NotifyPropertyChanged(); 
       } 
      } 
     } 

     private void NotifyPropertyChanged([CallerMemberName] string propertyName = "") 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 

    public class MainApplication 
    { 
     public OasisInstance OasisInst = new OasisInstance(); 
    } 

    public partial class MainWindow : Window 
    { 
     MainApplication mainApp = new MainApplication(); 
     DispatcherTimer timer = new DispatcherTimer(); 

     public MainWindow() 
     { 
      timer.Interval = TimeSpan.FromSeconds(1); 
      timer.Tick += (s, e) => { mainApp.OasisInst.ShowList.Add(DateTime.Now.ToString()); }; 
      timer.Start(); 

      InitializeComponent(); 

      lbxShows.ItemsSource = mainApp.OasisInst.ShowList; 
     } 
    } 
} 
+0

本当に助けになりました。私は今それを働かせた。いくつかの問題がありました。前述したように、コレクションアイテム自体とは対照的に、コレクションへの参照の概念を理解していたことがあります。また、ListBoxのItemsSourceプロパティをShowListに設定していた時点で、ShowListがnullになるように実際にコレクションを設定していませんでした。コレクションは後で作成され、塗りつぶされましたが、DataSourceには参照がありませんでした。私は空のコレクションを作成し、次にItemSourceを割り当て、それを後で埋めて整流しました。 –

0

あなたがShowListためmainAppに必要なのは

public ObservableCollection<string> ShowList {get; set;} 

あなたはgettersとそれを動作させるためのsetters`を持っている必要があります。