Wpf Int32Converter无法从';MyNamespace.MyEnum';当数据绑定ComboBox.SelectedItem时

Wpf Int32Converter无法从';MyNamespace.MyEnum';当数据绑定ComboBox.SelectedItem时,wpf,data-binding,mvvm,Wpf,Data Binding,Mvvm,用于撇油机。问题就在黑体字后面的底部 我正在使用ObjectDataProvider将组合框绑定到枚举类型。ObjectDataProvider非常简单 <ObjectDataProvider x:Key="FaultAreaValues" ObjectType="{x:Type FaultTrackCoreDBValues:FaultAreas}" MethodName="GetValues">

用于撇油机。问题就在黑体字后面的底部

我正在使用
ObjectDataProvider
将组合框绑定到枚举类型。
ObjectDataProvider
非常简单

<ObjectDataProvider x:Key="FaultAreaValues" 
                    ObjectType="{x:Type FaultTrackCoreDBValues:FaultAreas}"
                    MethodName="GetValues">

    <ObjectDataProvider.MethodParameters>
        <x:Type TypeName="FaultTrackCoreDBValues:FaultAreas" />
    </ObjectDataProvider.MethodParameters>

</ObjectDataProvider>
所有这些都很好。
组合框
由枚举中的正确值填充。我还使用了MVVM模式,因此视图的
DataContext
被设置为其关联的
ViewModel
的一个实例,它看起来(被裁剪)如下所示

public class ViewModel : INotifyPropertyChanged
{
    private IFault _Fault;

    public IFault Fault {
        get {
            return _Fault;
        }
        set {
            _Fault = value;
            OnPropertyChanged("Fault");
        }
    }
}
模型:

public interface IFault
{
    FaultAreas Area { get; set; }
}

public partial class Fault : IFault, INotifyPropertyChanged
{
    FaultAreas IFault.Area {
        get {
            return (FaultAreas)Area;
        }
        set {
            Area = (Int32)value;
        }
    }
}
需要注意的是,
Fault
是一个分部类,实际上是实体数据模型中的一个
实体
因为实体不支持.NET 4.5和Entity Framework 4.5之前的枚举,所以我使用显式接口来添加该支持,以及从了解实体对象的任何信息中完全解耦所有信息

以下是实际的
SelectedItem
绑定:

SelectedItem="{Binding Fault.Area}"
问题在于组合框的选择从未在初始设置,更改选择会导致装饰器显示,并导致以下异常:

System.Windows.Data错误:23:无法从类型转换“行为” “FaultAreas”为“en-US”区域性键入“System.Int32”,默认为 转换;考虑使用转换器的绑定属性。 NotSupportedException:'System.NotSupportedException:Int32Converter 无法从FaultTrack.Core.DBValues.FaultAreas转换。在 System.ComponentModel.TypeConverter.GetConvertFromException(对象 价值)在 System.ComponentModel.TypeConverter.ConvertFrom(ITypeDescriptorContext 上下文、文化信息文化、对象值)位于 System.ComponentModel.BaseNumberConverter.ConvertFrom(ITypeDescriptorContext 上下文、文化信息文化、对象值)位于 MS.Internal.Data.DefaultValueConverter.ConvertHelper(对象o,类型 destinationType,DependencyObject targetElement,CultureInfo区域性, 布尔值(向前)'


我不知道是什么原因造成的。我可以通过直接绑定到ViewModel上的
FaultAreas
属性来解决错误,但这不是我想要做的。我想绑定到模型的实例
IFault
,并了解发生此错误的原因。

当我稍微更改您的代码时,它对我有效

public partial class Fault : IFault, INotifyPropertyChanged
{
    private FaultAreas _area;
    public FaultAreas Area 
    {
        get { return (FaultAreas)_area; }
        set 
        {
            _area= value;
            OnPropertyChanged("Area");
        }
   }
 }
我可以看到初始值,绑定selecteditem也可以。我只是更改接口实现并调用OnPropertyChanged(“Area”)

编辑:它还可用于显式接口实现

public partial class Fault : IFault, INotifyPropertyChanged
{
    private int Area;

    public Fault()
    {
        Area = 0;//default?
    }

    FaultAreas IFault.Area
    {
        get{ return (FaultAreas)Area; }
        set
        {
            Area = (int)value;
            OnPropertyChanged("Area");
        }
    }
 }
绑定如下所示:

 SelectedItem="{Binding Path=Fault.(local:IFault.Area)}"

当我稍微修改一下你的代码时,它对我很有用

public partial class Fault : IFault, INotifyPropertyChanged
{
    private FaultAreas _area;
    public FaultAreas Area 
    {
        get { return (FaultAreas)_area; }
        set 
        {
            _area= value;
            OnPropertyChanged("Area");
        }
   }
 }
我可以看到初始值,绑定selecteditem也可以。我只是更改接口实现并调用OnPropertyChanged(“Area”)

编辑:它还可用于显式接口实现

public partial class Fault : IFault, INotifyPropertyChanged
{
    private int Area;

    public Fault()
    {
        Area = 0;//default?
    }

    FaultAreas IFault.Area
    {
        get{ return (FaultAreas)Area; }
        set
        {
            Area = (int)value;
            OnPropertyChanged("Area");
        }
    }
 }
绑定如下所示:

 SelectedItem="{Binding Path=Fault.(local:IFault.Area)}"

昨晚,我能够使用相同的语法
Fault.(FaultTrack.Data.IFault.Area)
获得绑定以传播更改,但是初始选择仍然不起作用(即使使用
OnPropertyChanged(“Area”)
)。您的代码与我的不同之处在于一个非常重要的方面,
Area=(Int32)value
<代码>区域是实体模型
故障
上的
Int32
属性,因此必须强制转换。现在唯一的问题是初始选择没有设置。我将解释这有助于解决问题的原因,它肯定不是全部的根本原因,而是一个有用的部分。编辑我的代码以满足您的int cast需要。仍然适用于我,并已做出初步选择。在IFault.Area getter中使用断点调试应用程序,以查看初始选择的值。可能没有默认设置,因此没有进行初始选择。昨晚我能够使用相同的语法
Fault.(FaultTrack.Data.IFault.Area)
,获得绑定以传播更改,但是初始选择仍然不起作用(即使使用
OnPropertyChanged(“Area”)
)。您的代码与我的不同之处在于一个非常重要的方面,
Area=(Int32)value
<代码>区域是实体模型
故障
上的
Int32
属性,因此必须强制转换。现在唯一的问题是初始选择没有设置。我将解释这有助于解决问题的原因,它肯定不是全部的根本原因,而是一个有用的部分。编辑我的代码以满足您的int cast需要。仍然适用于我,并已做出初步选择。在IFault.Area getter中使用断点调试应用程序,以查看初始选择的值。可能没有默认设置,因此没有进行初始选择。