Загрузка LongListSelector в MVVM - PullRequest
1 голос
/ 14 июля 2011

Я впервые использую MVVM Light, так что потерпите меня ...

У меня есть LongListSelector на моей главной странице, и я использую RelayCommand для загрузки данных из базы данных SQLCE при загрузке страницы.

В моей MainViewModel у меня есть свойство Workouts:

public const string WorkoutsPropertyName = "Workouts";

private PublicGrouping<DateTime, Workout> _workouts;
public PublicGrouping,DateDime, Workout> Workouts
{
    get { return workouts; }
    set
    {
        if (_workouts == value) { return; }
        _workouts = value;
        RaisePropertyChanged(WorkoutsPropertyName);
    }
}

Затем в конструкторе я создаю LoadedCommand:

public MainViewModel()
{
    LoadedCommand = new RelayCommand(() =>
    {
        context = new XLogDataContext();

        using (context)
        {
            if (context.Workouts.Count() > 0)
            {
                var workoutsByDate = from workout in context.Workouts
                                    group workout by workout.WorkoutDate
                                    into c
                                    orderby c.Key
                                    select c;
                Workouts = workoutsByDate as PublicGrouping<DateTime, Workout>;
            }
        }
    });
}

Когда запускается RelayCommand, Workouts всегда возвращает ноль. Я знаю, что данные возвращаются, поэтому я думаю, что проблема заключается в приведении запроса LINQ к PublicGrouping. Я также попытался создать свойства как

ObservableCollection<PublicGrouping<DateTime, Workout>>

но это тоже не работает.

UPDATE:

Я изменил RelayCommand для использования этой строки:

Workouts = new PublicGrouping<DateTime, Workout>(workoutsByDate);

и добавил этот конструктор для PublicGrouping:

private readonly IGrouping<TKey, TElement> _internalGrouping;

public PublicGrouping(IOrderedQueryable<IGrouping<DateTime, Workout>> workoutsByDate)
{
    _internalGrouping = (IGrouping<TKey, TElement>) workoutsByDate;
}

Я по-прежнему получаю исключение InvalidCastException для задания _internalGrouping в конструкторе.

Ответы [ 2 ]

2 голосов
/ 14 июля 2011

Действительно, ваше приведение не удастся, и использование оператора as не выбросит InvalidCastException в вашем случае, поэтому оно маскируется.

Создайте конструктор вашего PublicGrouping, который принимает IEnumerable того, что worksByDate содержит.

Этот тип приведения (называемый явным приведением):

object o = 2;
string h = (string)o;

Выдает InvalidCastException, если внутренний тип o не может быть приведен к строке. Оператор as не выдает это исключение и вместо этого возвращает ноль.

1 голос
/ 14 июля 2011

Это должно работать:

public const string WorkoutsPropertyName = "Workouts";

private List<PublicGrouping<DateTime, Workout>> _workouts;
public List<PublicGrouping<DateTime, Workout>> Workouts
{
    get { return _workouts; }
    set
    {
        if (_workouts == value)
        {
            return;
        }



         _workouts = value;

         RaisePropertyChanged(WorkoutsPropertyName);
        }
    }

    public MainViewModel()
    {
        LoadedCommand = new RelayCommand(() =>
            {
                context = new XLogDataContext();

                using (context)
                {
                    if (context.Workouts.Count() > 0)
                    {
                        var workoutsByDate = from workout in context.Workouts
                                            group workout by workout.WorkoutDate
                                            into c
                                            orderby c.Key
                                            select new PublicGrouping<DateTime, Workout>(c);
                        Workouts = workoutsByDate.ToList();
                    }
                }
            });
    }
...