3

次のように、DataTemplateを使用してViewModelにリンクされているビューがあります

<DataTemplate DataType="{x:Type ViewModels:ViewModel}">
    <Views:View />
</DataTemplate>

ViewModelProcessOptionは、タイプがのプロパティを保持しますMyEnum?。ここで、は、、、およびMyEnumの3つの値を持つカスタム列挙です。コンボボックスをこのプロパティにバインドしようとしているので、私が従うアプローチは次のとおりです。SingleMultipleAll

ViewModelには次のプロパティがありList<string>ます

public List<string> Options
    {
        get 
        {
            return Enum.GetNames(typeof(MyEnum)).ToList();
        }
    }

ItemsSourceのプロパティをバインドしますCombobox。次に、ProcessOptionプロパティに加えて、ViewModelにはOptionName(のstring)プロパティもあります。これは、選択したオプションの名前を保持することを目的としています。ViewModelが実装されINotifyPropertyChanged、両方のプロパティPropertyChangedがセッターでイベントを発生させます。私が使用しているバインディングは次のとおりです。

<ComboBox ItemsSource="{Binding Options}"
    SelectedItem="{Binding OptionName}"
    SelectedValue="{Binding ProcessOption}"/>

これは、この時点までは正常に機能します。最初はコンボボックスは空で、両方のプロパティは空ですnull。ユーザーがオプションを選択すると、これは必要に応じてViewModelに伝達されます。

データベースからデータをロードし、コントロールを初期値でロードしたい場合に問題が発生します。この場合、ViewModelのコンストラクターには次のものがあります。

this.ProcessOption = objectFromDB.ProcessOption // this is the value restored from DB,        let's say it is MyEnum.Multiple
this.OptionName = Options.First(x => x.Equals(Enum.GetName(typeof(MyEnum), objectFromDB.ProcessOption)));

問題は、上記で2つのプロパティが正しい値に設定されていても、後でComboboxバインディングからnullに設定されるため、初期値が保持されないことです。また、プロパティのセッターでのようなことを試みましif (value == null) { return; }た。この場合、ビューが読み込まれた後、プロパティは正しい値になりますが、Comboboxそれでも正しいオプションが表示されず、空になります。

また、設定も試みましたIsSynchronisedWithCurrentItemが、コンボボックスが空ではなく最初の要素が表示されることを除けば、何の違いもありません。

誰かがこのバインディングを手伝ってもらえますか?どんな助けでも大歓迎です、これは私を夢中にさせています!

4

1 に答える 1

0
<ComboBox ItemsSource="{Binding Options}"
    SelectedItem="{Binding OptionName}"
    SelectedValue="{Binding ProcessOption}"/>

バインディングはまったく機能しないように見えます。TwoWayバインディングが設定されていません。私は、どちらかまたは両方の提案だSelectedItemと思います。SelectedValue

OptionNameを削除し、(TwoWay)にバインドSelectedItemしてProcessOption(TwoWay)IValueConverterに変換することをお勧めしますstring

于 2012-04-27T13:27:31.807 に答える