我试图将字符串值列表绑定到列表框,以便逐行列出它们的值.现在我用这个:

<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.PersonNames放在MainPage.PersonNames中时,它还抱怨无法找到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> 

Update:

这是使用DataContext时的解决方案.下面的代码是您将传递给页面的DataContext的viewmodel和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>

希望这有帮助!:)

.net相关问答推荐

DI通过对象的接口而不是实际类型来解析服务

使用 PEM 文件创建 DSA 签名

PowerShell - 如果用户输入凭据,则查询 AD 时出错

C# 中的批量更新

使用 Thread.Abort() 有什么问题

在 C# 中将字符串转换为 colored颜色

如何摆脱 VS2008 中的目标程序集不包含服务类型错误消息?

我可以从我的应用程序中抛出哪些内置 .NET 异常?

抛出 ArgumentNullException

如何从 .net 中的数组类型获取数组项类型

调用委托与方法的性能

WCF服务客户端:内容类型text/html;响应消息的charset=utf-8 与绑定的内容类型不匹配

.NET 中是否有可序列化的通用键/值对类?

在同一解决方案中引用 2 个不同版本的 log4net

如何使用 c# 仅获取目录中的文件名?

.Net 正则表达式:单词字符 \w 是什么?

将月份 int 转换为月份名称

Microsoft.Bcl.Build NuGet 包有什么作用?

判断任意字符串是否为有效文件名的最简单方法

从不同程序集中的类名中解析类型