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

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

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

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

4 55

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

надеюсь, что это помогает! :)

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

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

или

<TextBlock Text="{Binding"} />

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

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

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

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

вы можете сделать это без необходимости явно определять элемент управления TextBlock как часть вашего списка (если вы не хотите улучшить форматирование). Трюк, чтобы получить привязку к триггеру, использует 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());
}