1

我正在尝试从 Linq 创建一个选择列表框,但是,我在设置每个列表框项的 id 值时遇到问题,该列表框项的 id 具有保存在本地数据库中的相应 id。我有以下代码:

public void display_Tips()
    {
       //commented out to try MrMDavidson's approach.
       // listBoxTipHistory.Items.Clear();
       // IList<Tips> tips = this.get_Tips();
       // foreach (Tips tip in tips)
       // {
       //     ListBoxItem li1 = new ListBoxItem();
       //     li1.Content = tip.date.Day + "-" + tip.date.Month + "-" + 
       //                       tip.date.Year + "-" + tip.date.Hour + ":" +
       //                       tip.date.Minute + " - " + tip.resturant + " - $" +
       //                       tip.tip_amount + " - $" + tip.billTotal;
       //     listBoxTipHistory.Items.Add(li1);
       // }
        if (listBoxTipHistory.Items.Count > 0)
        {
            listBoxTipHistory.Items.Clear();
        }
        listBoxTipHistory.ItemsSource = get_Tips();
}

public IList<Tips> get_Tips()
    {
        IList<Tips> tips = null;
        using (TipContext context = new TipContext(conString))
        {
            IQueryable<Tips> query =
                (from c in context.TipTable
                 orderby c.date descending
                 select c);
            tips = query.ToList();
        }
        return tips;
    }

本地数据库表:

[Table]
public class Tips
{
    [Column(IsPrimaryKey = true, IsDbGenerated = true)]
    public int tip_ID
    {
        get;
        set;
    }
    [Column(CanBeNull = false)]
    public float tip_amount
    {
        get;
        set;
    }
    [Column]
    public string resturant
    {
        get;
        set;
    }
    [Column(CanBeNull = false)]
    public DateTime date
    {
        get;
        set;
    }
  }

Xml代码:

  <ListBox SelectionChanged="showTipDetails" x:Name="listBoxTipHistory" Margin="6,3,0,0">
                    <DataTemplate>
                      <StackPanel>
                        <TextBlock Text="{Binding resturant}" />
                        <TextBlock Text="{Binding date}" />
                        <TextBlock Text="{Binding tip_amount}" />
                      </StackPanel>
                    </DataTemplate>
                </ListBox >

我现在正在尝试重新编码以使用 MrMDavidson 的建议,但是,使用此当前代码会导致列表显示“AppName.Tips”而不是实际的列数据。我已经尝试在谷歌上搜索演练和教程,但是,我一直无法提出解决方案。

此外,是否有特殊的方法来处理日期和时间?

任何建议,将不胜感激。

4

2 回答 2

4

听起来您正试图从 WinForms / CF.Net 风格的方法中做到这一点。虽然您可能可以这样做,但我建议您不要这样做,因为您真的没有得到 Silverlight 的价值。假设您的Tips班级看起来像;

public class Tip {
  public int Id { get; set; }
  public string Title { get; set; }
  public string Restaurant { get; set; }
}

然后,您可以将这些列表绑定到ListBox;

listBoxTipHistory.ItemsSource = get_Tips()

XAML用于描述这些项目的显示方式;

<ListBox x:Name="listBoxTipHistory">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <StackPanel>
        <TextBlock Text="{Binding Title}" />
        <TextBlock Text="{Binding Restaurant}" />
      </StackPanel>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

SelectedItemon将ListBox是当前选择的Tip(作为object),而不是实际ListBoxItem选择的。所以要获取选中的ID Tip

Tip selectedTip = listBoxTipHistory.SelectedItem as Tip;
if (selectedTip != null) {
  Console.WriteLine("The selected Tip is {0}", selectedTip.Id);
}

进一步的建议是让您查看INotifyPropertyChanged接口,该接口将允许对模型的更改自动在 UI 中更新

于 2012-05-24T02:48:40.063 回答
0

我同意@MrMDavidson 的观点,即您从老派的角度来处理这个问题,我也同意使用 ViewModel / Binding 方法会更好,但我会给出一个不需要您重写的答案到目前为止已经完成了。

DataContextfor设置为ListItemtip 对象:

foreach (Tips tip in tips)
{
    ListBoxItem li1 = new ListBoxItem();
    li1.Content = tip.date.Day + "-" // etc    
    li1.DataContext = tip;

    listBoxTipHistory.Items.Add(li1);
}

DataContext视为包含对象的控件 ( ListItem) 后面的容器。理想情况下,您应该ListItem从其 DataContext 中检索数据并填充其内容,但那是另一天的事了。现在只需将其设想为一个容器,您可以使用它来存储与该控件相关的数据。

现在,当您选择一个项目或用户按下提交时,您可以轻松检索该项目:

foreach (var item in listBoxTipHistory.SelectedItems)
{
    var tip = (Tip)item.DataContext;
    var tipId = tip.tip_ID; // or whatever you need to do
}
于 2012-05-24T04:44:24.233 回答