1

Linqから単一の選択リストボックスを作成しようとしていますが、ローカルデータベースに保存されている対応する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;
    }
  }

Xamlコード:

  <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()

YourXAMLは、これらのアイテムがどのように表示されるかを説明するために使用されます。

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

SelectedItem上のはListBox、現在選択されているTip( としてobject) であり、実際ListBoxItemに選択されているものではありません。したがって、選択したのIDを取得するにはTip;

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

さらに、モデルへの変更を UI で自動的に更新できるようにするINotifyPropertyChangedインターフェイスを調べることをお勧めします。

于 2012-05-24T02:48:40.063 に答える
0

私は@MrMDavidsonに、あなたが昔ながらの観点からこれに取り組んでいることに同意します。また、ViewModel / Bindingアプローチを使用する方が良いことに同意しますが、あなたが何を書き直す必要がないかについて答えます.これまでやってきました。

を tip オブジェクトに設定しDataContextます。ListItem

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 に答える