[英]Databinding with a listbox
我有一段代码从 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
来尝试将变量绑定到文本块。 以下只是绑定用户名。 我还有一个公共 class 可以获取/设置所有 3 个变量。
<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>
如果要拆分属性以使其看起来更好,则必须提供 object 而不是简单的字符串。 如果你只是添加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>
您将需要查看 class:
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;
补充说明:
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 你应该知道这一点。 它简化了您的工作并创建了更简洁的代码。
如果您想添加编辑功能或数据可以更改,您可能需要在视图 class 上实现INotifyPropertyChanged
。
您可以使用类型推断,这在处理繁琐的 class 名称时尤其有用。 var list = new ObservableCollection<SomeLongTypeName>()
节省了大量的打字和屏幕空间。
匈牙利符号让我畏缩;)
我认为您错过了 ItemTemplate。 尝试这个
<ListBox Height="346" HorizontalAlignment="Left" Margin="5,221,0,0" Name="lstbLeaders" VerticalAlignment="Top" Width="446">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Source=Fusername}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.