如何在WPF/WP7中将字符串列表数据绑定到ListBox?

liwlm1x9  于 2022-12-14  发布在  其他
关注(0)|答案(4)|浏览(226)

我尝试将一个字符串值列表绑定到一个列表框,以便逐行列出它们的值。

<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放进textblock,因为它们都是字符串值,而不是自定义类。
此外,它还抱怨说,当我在MainPage中找到PersonNames时,不必找到它,因为MainPage.PersonNames。
我将数据上下文设置为:

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

我做错了吗?

jjhzyzn0

jjhzyzn01#

如果简单地把你的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>

希望这对你有帮助!:)

uoifb46i

uoifb46i2#

您应该向我们展示PersonNames的代码,我不确定是否理解您的问题,但您可能希望按如下方式绑定它:

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

<TextBlock Text="{Binding}"/>

这将绑定到列表中的当前元素(假设PersonNames是一个字符串列表)。否则,您将在列表中看到类名。

amrnrhlw

amrnrhlw3#

如果items source可枚举为string-entries,请使用以下代码:

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

你可以在任何对象上使用这个语法。通常,ToString()方法会被调用来获取值。这在很多情况下是非常方便的。但是要注意,不会出现任何更改通知。

wz3gfoph

wz3gfoph4#

您可以在不将TextBlock控件显式定义为ListBox的一部分的情况下执行此操作(除非您需要更好的格式)。

窗口1.xaml

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

窗口1.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());
}

相关问题