Связывание ListBox.ItemsSource в коде и в xaml - PullRequest
8 голосов
/ 02 сентября 2010

Я написал простой код вроде

public ObservableCollection<string> Names …
public Window1()
{
    PutInDataIntoNames();
    InitializeComponent();
    this.listBox1.ItemsSource = Names;
}

и в xaml

<Grid>
    <ListBox Margin="10,11,10,16"
         Name="listBox1"
         Background="Black" 
         Foreground="Orange" 
         />
</Grid>

Тогда я хотел установить свойство ItemsSource в xaml. Для этого я написал следующее:

ItemsSource="{Binding Path=Names}"

К сожалению, это не работает. Не могли бы вы объяснить, почему и как это сделать правильно?

Ответы [ 3 ]

9 голосов
/ 01 апреля 2011

Если вы укажете только путь привязки, механизм привязки будет пытаться перемещаться по пути, начиная с текущего DataContext, поэтому ItemsSource="{Binding Path=Names}" работает не так, есть много разных вещей, которые следует иметь в виду, особенно при выполненииболее сложные вещи.

Самая важная статья, которую должен прочитать каждый новичок в DataBinding, - Обзор привязки данных в MSDN

Чтобы вернуться к привязкеесли вы хотите сделать это полностью в XAML, вы также можете сделать это, вам просто нужно как-то сделать Window вашим источником, либо напрямую, либо относительно, либо указав его как DataContext.

1- Прямая ссылка:

<Window Name="Window"
        ...>
    <Grid> 
            <ListBox ...
                     ItemsSource="{Binding ElementName=Window, Path=Names}"
                     .../>
    </Grid>
</Window>

2 - Относительная ссылка

    <Grid> 
            <ListBox ...
                     ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=Names}"
                     .../>
    </Grid>

3 - Настройка DataContext

<Window ...
        DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}">
    <Grid> 
            <ListBox ...
                     ItemsSource="{Binding Path=Names}"
                     .../>
    </Grid>
</Window>
5 голосов
/ 02 сентября 2010

Сделайте это в коде

public Window1() 
{ 
    PutInDataIntoNames(); 
    InitializeComponent(); 
    DataContext = this;
} 

и в XAML

<Grid> 
    <ListBox ItemsSource="{Binding Names}"
         Margin="10,11,10,16" 
         Name="listBox1" 
         Background="Black"  
         Foreground="Orange"   
         /> 
</Grid>

В идеале вы должны следовать схеме MVVM, чтобы изолировать данные от кода позади.

4 голосов
/ 18 ноября 2015

Кажется, что ваш Names может быть полем. Вы можете привязать ТОЛЬКО к публичным объектам

...