C# 无法转换为基类

C# 无法转换为基类,c#,wpf,mvvm,C#,Wpf,Mvvm,我正在用一个组合框和一个数据网格构建一个wpf表单。combobox绑定到模型基类moWeek的集合。所选项被绑定到一个名为wm的驱动类,如下所示SelectedItem=“{Binding Week,Mode=TwoWay}”,而它只是Viewmodel类中类型vm的属性 现在,当我从组合框中选择a值时,我得到一个名为type converter cannot convert model.moWeek的System.NotSupportedException 我想我需要一些从moWeek到vm

我正在用一个组合框和一个数据网格构建一个wpf表单。combobox绑定到模型基类moWeek的集合。所选项被绑定到一个名为wm的驱动类,如下所示
SelectedItem=“{Binding Week,Mode=TwoWay}”
,而它只是Viewmodel类中类型
vm
的属性

现在,当我从组合框中选择a值时,我得到一个名为type converter cannot convert model.moWeek的System.NotSupportedException

我想我需要一些从moWeek到vmWeek的转换器,但我不知道放在哪里,怎么放。我该怎么做

代码如下:

车型周课程:

using System.Collections.ObjectModel;

namespace Model
{
    public class moWeek
    {

        public moWeek()
        {

        }

        private int id;

        public int Id
        {
            get { return id; }
            set { id = value; }
        }
    }
}
using System;
using System.ComponentModel;
using Model;
using ViewModel.Lists;

namespace ViewModel.Planning
{
    public class vmWeek  : moWeek
    {
        private ProjectList projects;

        public ProjectList Projects
        {
            get { return projects; }
            set { projects = value; OnPropertyChanged(new PropertyChangedEventArgs("Projects")); }
        }

        private void OnPropertyChanged(PropertyChangedEventArgs propertyChangedEventArgs)
        {
            throw new NotImplementedException();
        }
    }
}
Viewmodel周课程:

using System.Collections.ObjectModel;

namespace Model
{
    public class moWeek
    {

        public moWeek()
        {

        }

        private int id;

        public int Id
        {
            get { return id; }
            set { id = value; }
        }
    }
}
using System;
using System.ComponentModel;
using Model;
using ViewModel.Lists;

namespace ViewModel.Planning
{
    public class vmWeek  : moWeek
    {
        private ProjectList projects;

        public ProjectList Projects
        {
            get { return projects; }
            set { projects = value; OnPropertyChanged(new PropertyChangedEventArgs("Projects")); }
        }

        private void OnPropertyChanged(PropertyChangedEventArgs propertyChangedEventArgs)
        {
            throw new NotImplementedException();
        }
    }
}
视图模型

using System.ComponentModel;
using tegViewModel.Auswahllisten;


namespace tegViewModel.Planning
{
    public class vmPlanning : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public vmPlanning()
        {
            Weeks = new alWeeks(); //Collection of moWeek

        }

        public alWeeks Weeks { get; set; }

        private vmWeek week;

        public vmWeek Week
        {
            get { return Week; }
            set { Week = value; OnPropertyChanged(new PropertyChangedEventArgs("Week")); }
        }


        private void OnPropertyChanged(PropertyChangedEventArgs propertyChangedEventArgs)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyChangedEventArgs.PropertyName));
            }

        }
    }
}

首先,您需要创建一个实现接口
IValueConverter

[ValueConversion(typeof(moWeek), typeof(vmWeek))]
class MoWeekToVmWeekConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var moweek = value as moWeek;
        vmWeek result = //Do your conversion;
        return result;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (moWeek) value;
    }
}
之后,您可以在参考资料中声明该类的实例

<local:MoWeekToVmWeekConverter x:Key="MoWeekConverter"></local:MoWeekToVmWeekConverter>

声明转换器后,可以在绑定中使用它

<ComboBox SelectedItem="{Binding Week, Mode=TwoWay, Converter={StaticResource MoWeekConverter}}"></ComboBox>


谢谢,这很好用。顺便说一下,我找到了另一个解决方案,通过将周的类型改为VMWAY的集合,并将一个隐式转换器转换成ALWek集合。我想知道为什么你不能这么做:)我决定把它当作一个先决条件。