数据绑定ComboBox.SelectedItem时,Int32Converter无法从'MyNamespace.MyEnum'转换

时间:2012-06-14 04:11:07

标签: wpf data-binding mvvm

对于撇油器。问题是在粗体文字后面的底部附近。

我使用ComboBoxObjectDataProvider数据绑定到枚举类型。 ObjectDataProvider非常简单。

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

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

</ObjectDataProvider>

我通过ComboBoxItemsSource进行数据绑定,这也很简单。

ItemsSource="{Binding Source={StaticResource FaultAreaValues}}"

所有这一切都很好。使用枚举中的适当值填充ComboBox。我也在使用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是实体数据模型中实际为Entity的部分类。因为实体不支持.NET之前的枚举4.5和Entity Framework 4.5,我使用一个显式接口来添加该支持,并完全解除所有关于Entity对象的知识。

这是实际的SelectedItem绑定:

SelectedItem="{Binding Fault.Area}"

问题是从未初始设置ComboBox的选择,并且更改选择会导致装饰器显示,并导致以下异常:

  

System.Windows.Data错误:23:无法从类型转换“行为”   'FaultAreas'默认为'en-US'文化键入'System.Int32'   转换;考虑使用Binding的Converter属性。   NotSupportedException:'System.NotSupportedException:Int32Converter   无法从FaultTrack.Core.DBValues.FaultAreas转换。在   System.ComponentModel.TypeConverter.GetConvertFromException(对象   价值)   System.ComponentModel.TypeConverter.ConvertFrom(ITypeDescriptorContext   上下文,CultureInfo文化,对象价值)   System.ComponentModel.BaseNumberConverter.ConvertFrom(ITypeDescriptorContext   上下文,CultureInfo文化,对象价值)   MS.Internal.Data.DefaultValueConverter.ConvertHelper(Object o,Type   destinationType,DependencyObject targetElement,CultureInfo culture,   Boolean isForward)'

我不确定是什么原因引起的。我可以通过直接绑定到ViewModel上的FaultAreas属性来解决错误,但这不是我想要做的。我想绑定到模型IFault的实例,并理解为什么会发生此错误。

1 个答案:

答案 0 :(得分:1)

当我稍微改变你的代码时,它对我有用。

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