【问题标题】:Cannot convert to base class无法转换为基类
【发布时间】:2016-12-24 10:47:01
【问题描述】:

我正在构建一个带有组合框和数据网格的 wpf 表单。组合框绑定到模型基类 moWeek 的集合。所选项目绑定到一个名为 wm 的派生类,例如 SelectedItem="{Binding Week, Mode=TwoWay}",而只是 Viewmodel 类中 vm 类型的属性。

现在,当我从组合框中选择一个值时,我得到一个名为 TypeConverter 的 System.NotSupportedException 无法转换 model.moWeek。

我想我需要某种从 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; }
        }
    }
}

Viewmodel 周课:

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

        }
    }
}

【问题讨论】:

    标签: c# wpf mvvm


    【解决方案1】:

    首先你需要创建一个实现接口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>
    

    【讨论】:

    • 谢谢,这很好用。顺便说一句,我找到了另一种解决方案,将 Weeks 的类型更改为 vmWeek 的集合,并将隐式转换器放入 alWeeks 集合中。
    • 我想知道你为什么不能这样做 :) 我决定将其作为先决条件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 2012-12-06
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    相关资源
    最近更新 更多