Я пытаюсь связать список строковых значений к полю списка так, чтобы их значения были перечислены линию за линией. Прямо сейчас я использую это:
<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}}"
Я делаю его неправильно?
Если просто помещено, что Ваш 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 это помогает! :)
Можно сделать это, не имея необходимость явно определять управление 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());
}
Необходимо показать нам Код для PersonNames, и я не уверен, я понимаю вопрос, но возможно Вы хотите связать его как это:
<TextBlock Text="{Binding Path=.}"/>
или
<TextBlock Text="{Binding"} />
Это свяжет с элементом тока в списке. (Принятие PersonNames является списком строк). Иначе Вы будете видеть имя класса в списке
Если источник объектов является счетным как строковые записи, используйте следующее:
<TextBlock Text="{Binding}"></TextBlock>
можно использовать этот синтаксис на любом объекте. Обычно ToString () - метод будет затем названный для получения значения. Это во многих случаях очень удобно. Но остерегайтесь, то никакое уведомление об изменении не произойдет.