Как спроектировать это, используя привязки WPF - PullRequest
0 голосов
/ 23 февраля 2011

У меня есть список «билетов», которые все происходят из абстрактного класса TicketBase.

public abstract class TicketBase
{
     public DateTime PublishedTime { get; set; }
     public String TicketType { get; set; }
}

public class TicketA : TicketBase
{
     public string PropertyA { get; set; }
}

public class TicketB : TicketBase
{
     public string PropertyB { get; set; }
}

В моей основной модели представления я запрашиваю базу данных и получаю обратно List<TicketBase> Tickets, упорядоченный вВ порядке возрастания ОпубликованоTimeTime.

На мой взгляд, я хочу получить что-то вроде:

Property A: <most recent value of PropertyA> 
Property B: <most recent value of PropertyB>

Так что я подумал о том, чтобы иметь SummaryViewModel, к которому я могу привязаться, который имеет такие свойства, как:

public string LatestPropertyA { get; set; }
public string LatestPropertyB { get; set; }

и в установщиках этих свойств просто выполните запрос linq для коллекции Tickets, которая получает самый верхний тикет, где TicketType является релевантным типом, и получает соответствующее свойство.

Есть ли способ, которым я могу передать TicketType как часть привязки, или мне нужно жестко закодировать тип в каждом из методов установки?

Кроме того, это лучший подход кэтот способ привязки, есть ли лучший способ использования какой-либо функции привязок WPF, с которой я не знаком?

1 Ответ

1 голос
/ 24 февраля 2011

Ваш базовый класс не должен зависеть от каких-либо дочерних элементов, производных от него, поэтому удалите TicketType и используйте оператор is, чтобы выяснить точный тип экземпляра TicketBase. Загрузите свои билеты в коллекцию билетов и получите к ним доступ из представления, используя обычную привязку данных, определенную в XAML. Ниже пример кода показывает, как написать свойства, которые используют linq.

Альтернативой может быть использование преобразователей значений и привязка данных к тикетам. Вы передаете тип и имя свойства в качестве параметров, а в конвертере значений вы возвращаете правильное значение свойства, используя отражение.

public class VM
{
    public VM()
    {
        Tickets = DB.LoadTicketsSorted();    
    }

    public string LatestPropertyA { get { return Tickets.Where(t => t is TicketA).Select(t => (t as TicketA).PropertyA).FirstOrDefault(); } }
    public string LatestPropertyB { get { return Tickets.Where(t => t is TicketB).Select(t => (t as TicketB).PropertyB).FirstOrDefault(); } }

    private List<TicketBase> Tickets;

}
...