1

「Make」と「Model」の 2 つのコンボがあります。それらの SelectedValue プロパティは、ModelID と MakeID を持つ Vehicle オブジェクトにバインドされています。

ヘレスモデル...

<ComboBox DisplayMemberPath="Description" ItemsSource="{Binding Path=ModelSpecs}" SelectedValue="{Binding Path=Vehicle.ModelID}" SelectedValuePath="ID" />

ユーザーは別のコントロールで Vehicles を検索できます。これにより、基になる Vehicle オブジェクトが交換されます。同じ Make の車両を切り替えると、すべて正常に動作しますが、Make が変更された場合は、データベースに移動して ModelSpec コレクションをリロードします。バインディングを更新する必要があるため、コンボにはモデルの説明が表示されません。

私の現在の回避策は、モデルをリロードするメソッドの最後にこれを追加することです。これは正常に機能しますが、特にエレガントなソリューションではありません。

        var modelID = ViewModel.Vehicle.ModelID;
        ViewModel.Vehicle.ModelID = string.Empty;
        ViewModel.Vehicle.ModelID = modelID;

基本的に、INotifyPropertyChanged をトリガーしているだけです ...

    private string _modelID;
    public string ModelID
    {
        get { return _modelID; }
        set 
        {
            if (_modelID == value) return;
            _modelID = value;
            OnPropertyChanged("ModelID");
        }
    }

私は似たような洗練されていない解決策をいくつか思いつくことができますが、もっと良い方法があるに違いありません! どんな助けでも大歓迎です!

4

3 に答える 3

1

ModelSpecコレクションを監視可能にするだけです(つまりINotifyCollectionChanged、自分で実装するか、ObservableCollectionクラスを使用します)。

于 2009-07-28T17:20:08.173 に答える
0

まあ、これはおそらく別の「不法な」解決策ですが、もう1つの正しい方法は、コンボボックスからBindingExpressionを取得し、BindingExpression.UpdateSourceを呼び出すことです

于 2009-07-28T17:10:01.673 に答える
0

助けてくれてありがとう、結局これはトリックをしました、そして私は私の最初の回避策よりそれを好みます。

私には問題ないように思えますが、他の人が恐怖で息を呑むかもしれないと思いますか?もしそうなら、遠慮なくコメントしてください!

ModelSpecsは私のManageVehicleViewModelにあるので、余分なPropertyChanged呼び出しを行うのは場違いではないようです。

    private IEnumerable<ModelSpec> _modelSpecs;
    public IEnumerable<ModelSpec> ModelSpecs
    {
        get
        {
            return _modelSpecs;
        }
        set
        {
            if (_modelSpecs == value) return;
            _modelSpecs = value;
            OnPropertyChanged("ModelSpecs");
            OnPropertyChanged("Vehicle");
        }
    }
于 2009-07-30T15:41:15.947 に答える