ObservableCollection не привязывается к ListBox в коде позади - PullRequest
0 голосов
/ 28 января 2012

Я хотел бы привязать поле списка к наблюдаемой коллекции в коде позади.Это то, что я использую для привязки:

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, он работал.Вы знаете, так ли это на самом деле?

Ответы [ 3 ]

1 голос
/ 28 января 2012

Хорошо, после комментариев к вашему вопросу, вот как объявить SymbolTable как ресурс в XAML и как привязать ListBox к нему.Обратите внимание на объявление пространства имен XAML 'local', которое относится к локальному пространству имен / сборке, которое в моем тестовом проекте называется ListBindingTest.

<Window x:Class="ListBindingTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:ListBindingTest"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:SymbolTable x:Key="symTable"/>
    </Window.Resources>
    <Grid>
        <ListBox ItemsSource="{Binding Source={StaticResource symTable}}"/>
    </Grid>
</Window>

Вы можете получить доступ к ресурсу SymbolTable в коде позади вашего класса окна, например:

SymbolTable st = (SymbolTable)Resources["symTable"];
st.Add(new Substance());
0 голосов
/ 28 января 2012

Вы всегда можете просто установить ItemSource прямо в списке.

substanceList.ItemsSource = symTable;
0 голосов
/ 28 января 2012

DisplayMemberPath должен быть открытым свойством symTable.

...