Как может я привязка данных список строк к ListBox в WPF/WP7?

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

<ListBox Margin="20" ItemsSource="{Binding Path=PersonNames}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Path=Id}"></TextBlock>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Но я не знаю то, что я, как предполагается, помещаю в textblock, вместо Id, так как они - все строковые значения, не пользовательские классы.

Также это жалуется, не имея необходимость найти PersonNames, когда у меня есть он в MainPage как MainPage. PersonNames.

Я установил контекст данных на:

DataContext="{Binding RelativeSource={RelativeSource Self}}"

Я делаю его неправильно?

62
задан 22 February 2012 в 12:59

4 ответа

Если просто помещено, что Ваш ItemsSource связывается как это:

YourListBox.ItemsSource = new List<String> { "One", "Two", "Three" };

Ваш XAML должен быть похожим:

<ListBox Margin="20" Name="YourListBox">
    <ListBox.ItemTemplate> 
        <DataTemplate> 
            <StackPanel Orientation="Horizontal"> 
                <TextBlock Text="{Binding}" /> 
            </StackPanel> 
        </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Обновление:

Это - решение при использовании DataContext. Следующий код является viewmodel, Вы будете передающими к DataContext страницы и установке DataContext:

public class MyViewModel
{
    public List<String> Items
    {
        get { return new List<String> { "One", "Two", "Three" }; }
    }
}

//This can be done in the Loaded event of the page:
DataContext = new MyViewModel();

Ваш XAML теперь похож на это:

<ListBox Margin="20" ItemsSource="{Binding Items}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding}" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

преимущество этого подхода состоит в том, что можно поместить намного больше свойств или сложных объектов в классе MyViewModel и извлечь их в XAML. Например, передать Список объектов Человека:

public class ViewModel
{
    public List<Person> Items
    {
        get
        {
            return new List<Person>
            {
                new Person { Name = "P1", Age = 1 },
                new Person { Name = "P2", Age = 2 }
            };
        }
    }
}

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

И XAML:

<ListBox Margin="20" ItemsSource="{Binding Items}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Path=Name}" />
                <TextBlock Text="{Binding Path=Age}" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Hope это помогает! :)

135
ответ дан 31 October 2019 в 13:27

Можно сделать это, не имея необходимость явно определять управление TextBlock как часть ListBox (если Вы не хотите лучшее форматирование). Прием к тому, чтобы заставлять привязку инициировать использует ObservableCollection<string> вместо List<string>

Window1.xaml

<ListView Width="250" Height="50" ItemsSource="{Binding MyListViewBinding}"/>

Window1.xaml.cs

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

   // Need to initialize this, otherwise you get a null exception
   MyListViewBinding = new ObservableCollection<string>();
}

public ObservableCollection<string> MyListViewBinding { get; set; }

// Add an item to the list        
private void Button_Click_Add(object sender, RoutedEventArgs e)
{
   // Custom control for entering a single string
   SingleEntryDialog _Dlg = new SingleEntryDialog();

   // OutputBox is a string property of the custom control
   if ((bool)_Dlg.ShowDialog())
      MyListViewBinding.Add(_Dlg.OutputBox.Trim());
}
2
ответ дан 31 October 2019 в 13:27

Необходимо показать нам Код для PersonNames, и я не уверен, я понимаю вопрос, но возможно Вы хотите связать его как это:

<TextBlock Text="{Binding Path=.}"/>

или

<TextBlock Text="{Binding"} />

Это свяжет с элементом тока в списке. (Принятие PersonNames является списком строк). Иначе Вы будете видеть имя класса в списке

16
ответ дан 31 October 2019 в 13:27

Если источник объектов является счетным как строковые записи, используйте следующее:

<TextBlock Text="{Binding}"></TextBlock> 

можно использовать этот синтаксис на любом объекте. Обычно ToString () - метод будет затем названный для получения значения. Это во многих случаях очень удобно. Но остерегайтесь, то никакое уведомление об изменении не произойдет.

9
ответ дан 31 October 2019 в 13:27

Другие вопросы по тегам:

Похожие вопросы: