3

アプリケーションでWPFリボンライブラリを使用し、次のようなコンボボックスを定義しました。

<r:RibbonComboBox>
    <r:RibbonGallery SelectedItem="{Binding ActiveCamera}">
        <r:RibbonGalleryCategory ItemsSource="{Binding AvailableCameras}"/>
    </r:RibbonGallery>
</r:RibbonComboBox>

バインディングソースは、ウィンドウのDataContext:で定義されます。

public Camera[] AvailableCameras
{
    get ...
}

public Camera ActiveCamera
{
    get { return _activeCamera; }
    set
    {
        if (_activeCamera != value && value != null)
        {
            _activeCamera = value;
            Notify("ActiveCamera");
            'Some more logic that is not related to UI
        }
        Debug.WriteLine("Active camera set to " + value);
    }
}

NameCameraは、プロパティと。を持つ単純なクラスにすぎませんid

ActiveCamera、ViewModelのコンストラクターでの最初の項目に設定されAvailableCamerasます。コードでそれを確認できました。

ただし、アプリケーションを起動すると、コンボボックスは空になります。デバッグ出力には、アプリケーションの起動後に次のように表示されます。

Active camera set to 713x BDA Analog Capture

コンボボックスをクリックすると、カメラが選択されているように見えます。

選択したアイテムのコンボボックス

さらに、次のデバッグ出力が追加されます。

Active camera set to

次に、ウィンドウ内の別の場所をクリックすると、コンボボックスが閉じて空のままになります。次のデバッグ出力が追加されます。

Active camera set to

しかし、この動作は一貫していないようです。コンボボックスをクリックしてからウィンドウ内の別の場所をクリックすると、最初のカメラが選択され、次のデバッグ出力が追加されます。

Active camera set to           (on click on the combobox)
Active camera set to 713x BDA Analog Capture

SelectedItemアプリケーションの起動時に境界が実際に選択される場合、これはすべて問題にはなりません。これを達成する方法はありますか?

4

2 に答える 2

0

これが問題かどうかはわかりませんが、ここで TwoWay バインディングがデフォルトであるかどうかを思い出せません。

SelectedItem="{Binding Path=ActiveCamera, Mode=TwoWay}"

また、最初のカメラを設定するときは、確実に呼び出されるActiveCameraフィールドではなく、プロパティを介して行われることを確認してください。_activeCameraNotify

これらは試してみる最初の簡単な手順です。これが役に立たない場合は、この回答にコメントしてください。私にできることがあるかどうかを確認します.


別のワイルドな推測。コレクションが配列であることに気付きました。これはコレクションへの変更を通知しないため、アイテムが後で追加された場合、GUI に通知されます。アイテムがリストに表示されるので、これは問題ではないと思います。に変更してみてくださいObservableCollection<Camera>

あなたの投稿をよく読んだ私の推測では、あなたは初心者ではなく、WPF データバインディングのニュアンスをよく知っているということです。あれは正しいですか?

于 2012-08-31T17:00:23.817 に答える