Я хотел бы привязать поле списка к наблюдаемой коллекции в коде позади.Это то, что я использую для привязки:
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");
Кто-нибудь знает какой-либо другой способ сделать это в коде или XAML, я думаю, ElementName
относится к объектам, определенным в коде позади.
Вот частьопределение класса для 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.Я использовал Items.Add в своем методе Insert, я предполагаю, что Items.Add не вызывает событие INotifyChanged, поэтому ListBox не обновлялся, но когда добавлялся Add вместо Items.Add, он работал.Вы знаете, так ли это на самом деле?