Как я могу привязать данные списка строк к ListBox в WPF / WP7? - PullRequest
60 голосов
/ 22 февраля 2012

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

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

Но я не знаю, что я должен поместить в текстовый блок вместо Id, поскольку все они являются строковыми значениями, а не пользовательскими классами.

Также он жалуется на то, что ему не нужно искать PersonNames, когда он у меня внутри MainPage, как MainPage.PersonNames.

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

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

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

Ответы [ 4 ]

132 голосов
/ 22 февраля 2012

Если просто указать, что ваш 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.Следующий код является моделью представления, которую вы будете передавать 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.Например, чтобы передать объекты List of Person:

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>

Надеюсь, это поможет!:)

14 голосов
/ 22 февраля 2012

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

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

или

<TextBlock Text="{Binding"} />

Это будет привязано к текущему элементу в списке. (Предполагая, что PersonNames представляет собой список строк). В противном случае вы увидите имя класса в списке

8 голосов
/ 22 февраля 2012

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

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

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

2 голосов
/ 01 декабря 2017

Вы можете сделать это без необходимости явно определять элемент управления 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());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...