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中使用断点调试应用程序,以查看初始选择的值。可能没有默认设置,因此没有进行初始选择。