2009-05-31 3 views
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 
}; 

Если я установить свойство ItemsSource, скажем, в ListBox, как показано ниже:

lstBox.ItemsSource = TimeSlotsInfo; 

Теперь, как установить путь привязки для ссылки на поле «BackgroundCol» из приведенного выше результата запроса?

Я попытался {Binding Path = TimeSlotInfo.BackgroundCol}, {Binding Path = TimeSlotInfo/BackgroundCol}, и, наконец, {Binding Path = BackgroundCol} ... никто из них не похоже, работает ..

Может ли кто-нибудь помочь? Я попытался максимально упростить пример. Надеюсь, моя проблема достаточно ясна. Спасибо заранее.

ответ

5

Последний правильный ({Binding Path = BackgroundCol}) - однако вы не можете привязываться к полям, вы можете привязываться только к свойствам. Определите ваш класс будет:

class TimeslotInfo { 
    public int TimeslotId {get; set;} 
    /* Etc... */ 
} 
+0

Я просто подумал об этом и собирался отредактировать мой вышеприведенный пост, чтобы включить его. +1, ты прав! – Pwninstein

0

Если вы хотите, чтобы ваши объекты отображали все, что хранится в BackgroundCol, вы можете просто установить свойство DisplayMemberPath в ListBox на «BackgroundCol». Если это не то, чего вы пытаетесь достичь, будьте более конкретными.

Надеюсь, что это поможет!

+0

А, я не знал этого - я не думаю, что здесь что-то не так (как я отправляю в своем ответе), но это крутой ярлык. –

3

Не только вы должны использовать свойства для связывания, как говорит Павел, но в целом вы должны avoid public fields в первую очередь.

Кроме того, это не похоже, что это должна быть структура - действительно ли вы хотите семантику значения типа? Если вы сомневаетесь, вы должны по умолчанию создавать классы на C# - довольно редко вам нужно действительно хочу структуру.

И, наконец, даже если вы сделали хотите структуру, вы должны почти всегда делать структуры неизменными. Вы почти наверняка получили неожиданные результаты от изменяемых структур. Все это хорошо определено и по уважительным причинам, но, вероятно, это не то поведение, которое вы ожидаете. Смещаемые структуры злы.

+0

Разве вы не теряете какой-либо возможной выгоды от структур, когда вы запускаете его через LINQ? (то есть все они будут в коробке в любом случае?) –

+0

Зачем им быть в коробке? Компилятор знает подходящий тип для использования. –

Смежные вопросы