1

スキマー向け。質問は、太字のテキストの直後の下部にあります。

ComboBoxを使用して、を列挙型にデータバインディングしていObjectDataProviderます。ObjectDataProviderとても簡単です。

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

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

</ObjectDataProvider>

ComboBoxviaをデータバインドし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にはエンティティデータモデルにある部分的なクラスであることに注意することが重要です。Entityは.NET4.5およびEntityFramework4.5より前の列挙をサポートしていないため、明示的なインターフェイスを使用してそのサポートを追加し、Entityオブジェクトについて何も知らないようにすべてを完全に切り離します。

実際のSelectedItemバインディングは次のとおりです。

SelectedItem="{Binding Fault.Area}"

問題は、ComboBoxの選択が最初に設定されることはなく、選択を変更すると装飾者が表示され、次の例外が発生することです。

System.Windows.Dataエラー:23:デフォルトの変換では「en-US」カルチャの「Behavior」を「FaultAreas」タイプから「System.Int32」タイプに変換できません。BindingのConverterプロパティの使用を検討してください。NotSupportedException:'System.NotSupportedException:Int32ConverterはFaultTrack.Core.DBValues.FaultAreasから変換できません。System.ComponentModel.TypeConverter.GetConvertFromException(オブジェクト値)at System.ComponentModel.TypeConverter.ConvertFrom(ITypeDescriptorContextコンテキスト、CultureInfoカルチャ、オブジェクト値)at System.ComponentModel.BaseNumberConverter.ConvertFrom(ITypeDescriptorContextコンテキスト、CultureInfoカルチャ、オブジェクト値)MS .Internal.Data.DefaultValueConverter.ConvertHelper(Object o、Type destinationType、DependencyObject targetElement、CultureInfoculture、

何が原因かわかりません。ViewModelのプロパティに直接バインドすることでエラーを解決できますFaultAreasが、それは私がやりたいことではありません。IFaultモデルのインスタンスにバインドして、このエラーが発生する理由を理解したいと思います。

4

1 に答える 1

1

コードを少し変更すると、うまくいきます。

public partial class Fault : IFault, INotifyPropertyChanged
{
    private FaultAreas _area;
    public FaultAreas Area 
    {
        get { return (FaultAreas)_area; }
        set 
        {
            _area= value;
            OnPropertyChanged("Area");
        }
   }
 }

初期値を確認でき、選択したアイテムのバインドも機能します。インターフェイスの実装を変更して、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)}"
于 2012-06-14T06:25:33.993 に答える