2011-07-14 25 views
1
一個LongListSelector

我使用MVVM光的第一次,所以我承擔......加載在MVVM

我有我的主頁面LongListSelector,和我使用的是RelayCommand從數據加載它加載頁面時的SQLCE數據庫。

在我MainViewModel,我有一個屬性鍛鍊:

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運行,鍛鍊總是返回null。我知道有數據被返回,所以我認爲問題在於將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; 
} 

我還是坐上_internalGrouping分配新建分配FY InvalidCastException的在構造函數中。

回答

1

這應該工作:

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(); 
        } 
       } 
      }); 
    } 
2

事實上,您的演員陣容將會失敗,並且使用as運營商不會在您的案例中拋出InvalidCastException,因此它將被屏蔽。

創建一個PublicGrouping的構造函數,其中包含IEnumerable的任何worksByDate包含的構造函數。

這種鑄造的(稱爲顯式鑄造):

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

拋出InvalidCastException如果o內部類型不能轉換爲字符串。 as運算符不會拋出此異常,而是返回null。

+1

Upvoted爲 '爲' 經營者隱藏例外。 – JeffCren