对于撇油器。问题是在粗体文字后面的底部附近。
我使用ComboBox
将ObjectDataProvider
数据绑定到枚举类型。 ObjectDataProvider
非常简单。
<ObjectDataProvider x:Key="FaultAreaValues"
ObjectType="{x:Type FaultTrackCoreDBValues:FaultAreas}"
MethodName="GetValues">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="FaultTrackCoreDBValues:FaultAreas" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
我通过ComboBox
对ItemsSource
进行数据绑定,这也很简单。
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
的实例,并理解为什么会发生此错误。
答案 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)}"