2010-09-02 5 views
5

Я написал простой код, какListBox.ItemsSource связывания в коде и в XAML

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

ли это в коде позади

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 дизайн для выделения данных из кода позади.

+0

OK. но я бы предпочел, чтобы записать его в XAML как <локальный: ViewModel /> Это часто немного обидно, что иногда мне dont't нужно явно установить DataContext иногда я должен. –

8

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

Самая важная статья, что каждый, кто является новым для DataBinding следует читать это Data Binding Overview on MSDN

Чтобы вернуться к вашей привязки, если вы хотите сделать это полностью в XAML вы можете сделать это, как хорошо, вы просто необходимо сделать Окно вашим источником каким-то образом, либо путем ссылки на него прямо или относительно, либо путем его настройки в качестве 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> 
3

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

Смежные вопросы