Подтвердить что ты не робот

Как я могу привязать данные строк к 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>

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

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

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

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

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

4b9b3361

Ответ 1

Если просто указать, что ваш 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> 

Update:

Это решение при использовании 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. Например, чтобы передать объекты 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>

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

Ответ 2

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

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

или

<TextBlock Text="{Binding"} />

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

Ответ 3

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

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

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

Ответ 4

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