WPF/MVVM:重构代码以使其为MVVM绑定做好准备

WPF/MVVM:重构代码以使其为MVVM绑定做好准备,wpf,mvvm,refactoring,code-behind,Wpf,Mvvm,Refactoring,Code Behind,我在视图的代码隐藏文件中有以下代码: private string GetSelectedSchoolclassCode() { return ((SchoolclassCode)cboSchooclassCodeList.SelectedItem).SchoolclassCodeName; } private void dgTimeTable_MouseLeftButtonDown(object sender, MouseButtonEventArgs

我在视图的代码隐藏文件中有以下代码:

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;
    }
我想把所有这些代码放在ViewModel中。 问题已经从XAML中的CurrentColumn.DisplayIndex开始。我不能用绑定声明它,因为语法是不允许的。WPF认为DisplayIndex是一个附加属性


您会怎么做?

在处理复杂控件(如数据网格)时,实现纯XAML/ViewModel分离可能会很棘手,而且相当复杂。在某些情况下,最好有一点代码来实现更干净的XAML和代码

也许试试

private void dgTimeTable_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{        
    var columnNumber = dgTimeTable.CurrentCell.Column.DisplayIndex;
    ((YourViewModel)DataContext).SetDisplayIndex(columnNumber);
}
在您的视图模型中包含其余的代码

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;
}
如果您将组合框绑定到SelectedSchooclass,并将数据网格上的currentitem绑定到视图模型

什么是“WPF思考”?若您正在进行绑定,那个么您可以而且必须提供完整的路径,若路径不明显,那个么还需要提供源代码。没有思考。除此之外,这种转变是可怕的;枚举有数值,可以写在一行中。