gpt4 book ai didi

c# - 使用列表框进行数据绑定(bind)

转载 作者:太空狗 更新时间:2023-10-29 23:10:36 25 4
gpt4 key购买 nike

我有一些代码可以从 HTTP 服务器读取 json 响应,然后解析它并将数据插入到 ListBox 控件中。

下载完成后触发的事件如下:

 void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
DataContractJsonSerializer ser = null;

try
{
ser =
new DataContractJsonSerializer(typeof(ObservableCollection<UserLeaderboards>));

ObservableCollection<UserLeaderboards> users =
ser.ReadObject(e.Result) as ObservableCollection<UserLeaderboards>;

foreach (UserLeaderboards em in users)
{
int Fid = em.id;
string Fusername = em.username;
int Fscore = em.score;
lstbLeaders.Items.Add(Fid + Fusername + Fscore);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

现在,当我执行 items.add 时,我假设它只是连接 3 个变量并将其添加到 ListBox 中的一列。这工作正常,我看到所有 3 个项目都合并并显示出来。

我想把它分开并让它看起来更好一点,所以我创建了一些 XAML 来尝试将变量绑定(bind)到文本 block 。下面只是绑定(bind)用户名。我还有一个获取/设置所有 3 个变量的公共(public)类。

<ListBox Height="346" HorizontalAlignment="Left" Margin="5,221,0,0" 
Name="lstbLeaders" VerticalAlignment="Top" Width="446">
<DataTemplate>
<TextBlock Text="{Binding Source=Fusername}" />
</DataTemplate>
</ListBox>

当运行上面的命令时,我什么也没有显示。我觉得这很简单?

谢谢。

最佳答案

要显示一个简单的字符串,您的 xaml 应该如下所示:

<ListBox Height="346" HorizontalAlignment="Left" Margin="5,221,0,0" 
Name="lstbLeaders" VerticalAlignment="Top" Width="446">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}" />
</DataTemplate>
<ListBox.ItemTemplate>
</ListBox>

如果你想拆分属性以使其看起来更好,你必须提供一个对象而不是一个简单的字符串。如果你只是添加 Fid + Fusername + Fscore你最终会得到一个普通的字符串。

<ListBox Height="346" HorizontalAlignment="Left" Margin="5,221,0,0" 
Name="lstbLeaders" VerticalAlignment="Top" Width="446">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Id}" />
<TextBlock Text="{Binding Name}" />
<TextBlock Text="{Binding Score}" />
</StackPanel>
</DataTemplate>
<ListBox.ItemTemplate>
</ListBox>

你需要一个 View 类:

public class UserView
{
public string Id {get;set;}
public string Name {get;set;}
public int Score {get;set;}
}

在你后面的代码中:

var usersList = new List<UserView>();

foreach (UserLeaderboards em in users)
{
int Fid = em.id;
string Fusername = em.username;
int Fscore = em.score;
usersList.Add(new UserView { Id = Fid, Name = Fusername, Score = Fscore} );
}

lstbLeaders.ItemsSource = usersList;

补充说明:

  • 为什么不绑定(bind) ObservableCollection<UserLeaderboards>直接到列表框?

如果没有理由转换为其他类型,请跳过 foreach部分代码,只需设置 lstbLeaders.ItemsSource = users; .

void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
try
{
var ser = new DataContractJsonSerializer(
typeof(ObservableCollection<UserLeaderboards>));

var users = ser.ReadObject(e.Result)
as ObservableCollection<UserLeaderboards>;

lstbLeaders.ItemsSource = users;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
  • 看看 MVVM 模式。如果您想使用 XAML,您应该了解这一点。它可以简化您的工作并创建更简洁的代码。

  • 如果您想添加编辑功能或数据可以更改,您可能需要实现 INotifyPropertyChanged在 View 类上。

  • 您可以使用类型推断,这在处理繁琐的类名时特别有用。 var list = new ObservableCollection<SomeLongTypeName>()节省大量打字和屏幕空间。

  • 匈牙利符号让我感到畏缩;)

关于c# - 使用列表框进行数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6191467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com