2010-06-25 7 views
0

Je le code dans mon fichier code-behind de mon point de vue:WPF/MVVM: refactorisation de code-behind pour le rendre prêt à MVVM lier

private string GetSelectedSchoolclassCode() 
    { 
     return ((SchoolclassCode)cboSchooclassCodeList.SelectedItem).SchoolclassCodeName; 
    } 

    private void dgTimeTable_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    {   
     var columnNumber = dgTimeTable.CurrentCell.Column.DisplayIndex; 
     var timetable = dgTimeTable.CurrentItem as TimeTableViewModel; 

     switch (columnNumber) 
     { 
      case 0: timetable.SchoolclassCodeMonday = GetItemValue(timetable.SchoolclassCodeMonday); break; 
      case 1: timetable.SchoolclassCodeTuesday = GetItemValue(timetable.SchoolclassCodeTuesday); break; 
      case 2: timetable.SchoolclassCodeWednesday = GetItemValue(timetable.SchoolclassCodeWednesday); break; 
      case 3: timetable.SchoolclassCodeThursday = GetItemValue(timetable.SchoolclassCodeThursday); break; 
      case 4: timetable.SchoolclassCodeFriday = GetItemValue(timetable.SchoolclassCodeFriday); break; 
      case 5: timetable.SchoolclassCodeSaturday = GetItemValue(timetable.SchoolclassCodeSaturday); break; 
      case 6: timetable.SchoolclassCodeSunday = GetItemValue(timetable.SchoolclassCodeSunday); break; 
     } 
    } 

    private string GetItemValue(string schoolclassCodeWeekDay) 
    { 
     if (schoolclassCodeWeekDay == null) 
      schoolclassCodeWeekDay = GetSelectedSchoolclassCode(); 
     else 
      schoolclassCodeWeekDay = null; 

     return schoolclassCodeWeekDay; 
    } 

Je voudrais mettre tout ce code dans le ViewModel . Le problème commence déjà avec le CurrentColumn.DisplayIndex en XAML. Je ne peux pas le déclarer avec une liaison car la syntaxe n'est pas autorisée. WPF pense que DisplayIndex est une propriété attachée ...

Que feriez-vous?

+1

Que signifie "WPF pense"? Si vous faites une liaison vous pouvez et devez fournir le chemin complet et si ce n'est pas évident alors aussi Source. Il n'y a pas de réflexion. D'ailleurs ce changement est terrible; les énumérations ont des valeurs numériques et peuvent être écrites sur une ligne. – kubal5003

+0

Il n'y a pas d'enums ... – msfanboy

Répondre

0

Il peut être astucieux et assez complexe d'obtenir une séparation pure XAML/ViewModel lorsqu'il s'agit de contrôles complexes tels qu'une grille de données. Dans certains cas, il est préférable d'avoir un peu de code pour obtenir du code XAML et du code plus propres.

peut-être essayer

private void dgTimeTable_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{   
    var columnNumber = dgTimeTable.CurrentCell.Column.DisplayIndex; 
    ((YourViewModel)DataContext).SetDisplayIndex(columnNumber); 
} 

et dans votre modèle de vue ont le reste du code

private string GetSelectedSchoolclassCode() 
{ 
    return ((SchoolclassCode)SelectedSchooclass).SchoolclassCodeName; 
} 

public int SetDisplayIndex(int columnNmber) 
{   
     var timetable = CurrentItem as TimeTableViewModel; 

     switch (columnNumber) 
     { 
      case 0: timetable.SchoolclassCodeMonday = GetItemValue(timetable.SchoolclassCodeMonday); break; 
      case 1: timetable.SchoolclassCodeTuesday = GetItemValue(timetable.SchoolclassCodeTuesday); break; 
      case 2: timetable.SchoolclassCodeWednesday = GetItemValue(timetable.SchoolclassCodeWednesday); break; 
      case 3: timetable.SchoolclassCodeThursday = GetItemValue(timetable.SchoolclassCodeThursday); break; 
      case 4: timetable.SchoolclassCodeFriday = GetItemValue(timetable.SchoolclassCodeFriday); break; 
      case 5: timetable.SchoolclassCodeSaturday = GetItemValue(timetable.SchoolclassCodeSaturday); break; 
      case 6: timetable.SchoolclassCodeSunday = GetItemValue(timetable.SchoolclassCodeSunday); break; 
     } 
    } 

private string GetItemValue(string schoolclassCodeWeekDay) 
{ 
    if (schoolclassCodeWeekDay == null) 
     schoolclassCodeWeekDay = GetSelectedSchoolclassCode(); 
    else 
     schoolclassCodeWeekDay = null; 

    return schoolclassCodeWeekDay; 
} 

vous fournis comprennent des fixations pour le combobox à SelectedSchooclass et currentItem sur la grille de données à la vue modèle

Questions connexes