コード ビハインドでリスト ボックスを観察可能なコレクションにバインドしたいと考えています。これは私がバインディングに使用しているものです:
Binding binding = new Binding();
binding.Source = symTable;
substanceList.SetBinding(ListBox.ItemsSourceProperty, binding);
symTable
から継承するObservableCollection
と、Count プロパティが適切に更新されるため、要素を正しく追加していることはわかっていますが、リスト ボックスはそうではありません。XAMLではリスト全体にバインドされているため、パスを何に設定すればよいかわかりませんでした。
注: ListBox に個々の項目を追加すると、それらが表示されるため、表示上の問題ではありません。私も試しました:
this.Resources.Add("symTable", symTable);
ウィンドウコンストラクターで、次にこれ:
しかし、リソースを解決できないと言われています。
また、XAML でリソースとして追加しようとしましたが、再び機能しませんでした: //ウィンドウのリソースで。
<s:SymbolTable x:Key="symTable"/>
...
<ListBox x:Name="substanceList" ItemsSource="{Binding Source={StaticResource symTable}}"/>
そしてコードビハインドで:
symTable = (SymbolTable)this.FindResource("symTable");
ElementName
コードビハインドまたはXAMLでこれを行う他の方法を知っている人はいますか?コードビハインドで定義されたオブジェクトを参照していると思います。
symTable のクラス定義の一部を次に示します。
public class SymbolTable : ObservableCollection<Substance>
{
Dictionary<string, Substance> symbolTable;
...
public Substance Insert(Substance s)
{
if (!symbolTable.ContainsKey(s.Name))
{
symbolTable.Add(s.Name, s);
Items.Add(s);
}
return symbolTable[s.Name];
}
わかりましたので、最も奇妙なことに気付きました。Items.Addは INotifyChanged イベントを発生させていませんでした。私は Insert メソッドで Items.Add を使用しました。Items.Add は INotifyChanged イベントを発生させないため、ListBox は更新されていないと推測していますが、Items.Add の代わりに Add を実行すると、機能しました。これが実際に当てはまるかどうか知っていますか?