1

C# に次の構造体定義があるとします。

    public struct TimeSlotInfo
    {
        public int TimeSlotID;
        public int StartMin;
        public int CalcGridColumn;
        public string BackgroundCol;
        public bool ToDisable;
    }

そして、私は次のようなlinqクエリを持っています:

var TimeSlotsInfo = 
from ts in datacon.TimeSlots
select new TimeSlotInfo
{
    TimeSlotID = ts.TimeSlotID,
    StartMin = ts.StartMin,
    CalcGridColumn = CalcTimeSlotGridColumn(ts.StartMin),
    BackgroundCol = ts.ColorName,
    ToDisable = false
};

たとえば、ListBox の ItemsSource プロパティを以下のように設定した場合:

lstBox.ItemsSource = TimeSlotsInfo;

さて、上記のクエリ結果から「BackgroundCol」フィールドを参照するバインディング パスを設定するにはどうすればよいでしょうか。

{Binding Path=TimeSlotInfo.BackgroundCol}、{Binding Path=TimeSlotInfo/BackgroundCol}、そして最後に {Binding Path=BackgroundCol} を試しました...どれも機能していないようです..

誰でも助けることができますか?例をできるだけ単純化しようとしました。私の問題が十分に明確であることを願っています。前もって感謝します。

4

3 に答える 3

5

最後の 1 つは正しい ({Binding Path=BackgroundCol}) - ただし、フィールドにバインドすることはできず、プロパティにのみバインドできます。クラスを次のように定義します。

class TimeslotInfo {
    public int TimeslotId {get; set;}
    /* Etc... */
}
于 2009-05-31T18:38:59.597 に答える
3

Paul が言うように、バインドにプロパティを使用する必要があるだけでなく、一般に、最初からpublic フィールドを避ける必要があります。

さらに、これは構造体であるべきだとは思えません。本当に値型のセマンティクスが必要ですか? 疑問がある場合は、デフォルトで C# でクラスを作成する必要があります。本当に構造体が必要になることはほとんどありません。

最後に、構造体が必要な場合でも、ほとんどの場合、構造体を不変にする必要があります。変更可能な構造体から予期しない結果が生じることはほぼ確実です。それはすべて明確に定義されており、正当な理由がありますが、おそらく期待どおりの動作ではありません。可変構造体は悪です。

于 2009-05-31T18:42:46.390 に答える
0

BackgroundCol に保存されているものを項目に表示したい場合は、ListBox の DisplayMemberPath プロパティを "BackgroundCol" に設定するだけです。これが達成しようとしているものでない場合は、より具体的にしてください。

お役に立てれば!!

于 2009-05-31T18:37:20.427 に答える