Silverlight コンボボックスの表示項目数が更新される
-
18-09-2019 - |
質問
SL ページに 2 つのコンボ ボックスがあります。コンボ 1 が更新されると、サービスが呼び出され、コンボ 2 が設定されます。
最初の呼び出しでは、3 つの結果が返されます。コンボ ボックスを展開すると、3 つのオプションがすべて表示されます。
2 回目の呼び出しでは、4 つの結果が返されます。コンボ ボックスを展開すると、垂直スクロール バーとともに 3 つのオプションが表示されます。
リロードしてこれらの手順を逆に実行すると、最初の呼び出しでは 4 行が取得され、2 回目の呼び出しでは 3 行 + 空白行が取得されます。(いいえ、空白は記録ではありません。選択することはできません。)
ドロップダウン リストのサイズは最初に生成された高さを維持しているようです。
各サービス呼び出し後に表示されるコンボボックスの最大項目を更新するにはどうすればよいですか?
ありがとう!
編集 #1
コードは M-V-VM パターンに従っています。ページが読み込まれると、 Group1
最初のコンボ ボックスに値が入力され、何も選択されていません。ユーザーが選択を行うと、その選択は Group1Selection にバインドされます。
<ComboBox ItemsSource="{Binding Path=Group1}" SelectedItem="{Binding Path=Group1Selection}" />
<ComboBox ItemsSource="{Binding Path=Group2}" SelectedItem="{Binding Path=Group2Selection}" />
ビューモデル内の set アクセサー内で、 Group1Selection
プロパティ、私は次のようなものを持っています
set
{
if (group1Selection != value)
{
group1Selection = value;
PopulateGroup2();
OnPropertyChanged("Group1Selection");
}
}
PopulateGroup2 がサービス呼び出しを非同期で実行し、データを取得し、そのデータを公開プロパティに置きます。 Group2
.
「通常の」条件では、ほとんどのオプションには数十の選択肢があるため、これは問題にはなりません。ただし、そのうちのいくつかは、 Group1
選択肢には 3 つまたは 4 つの子の選択肢しかありません。これらのいずれかが最初に選択された場合、そのアプリケーション インスタンスの残りのコンボ ボックスの高さは、表示される項目の最大数が 8 ではなく、それぞれ 3 または 4 に設定されます。
M-V-VM パターンに従って、コードビハインドにはコードがありません。
解決
これは、Silverlight 2 の ComboBox の既知のバグです。SL3では修正されていると思います。
これは次の手順で修正できます。
コンボボックスから継承
パブリッククラス MyComboBox :コンボボックス
OnApplyTemplate() メソッド内の ComboBox の「Popup」部分への参照を取得します。
Popup thePopup = GetTemplateChild("Popup") as Popup; FrameworkElement thePopupContent = thePopup.Child as FrameworkElement;
OnItemsChanged メソッドをオーバーライドする
オーバーライドされた OnItemsChagned メソッド内で、ClearValue(DP) メソッドを使用して Popup の高さと幅の依存関係プロパティをリセットします。
thePopupContent.ClearValue(FrameworkElement.WidthProperty); thePopupContent.ClearValue(FrameworkElement.HeightProperty);
高さと幅の最大値と最小値が心配な場合は、これらのプロパティもクリアできます。
他のヒント
それは完璧な解決策でした。マルティさん、ありがとうございます。
興味のある方のために、クラスは次のようになります。
using System.Windows.Controls.Primitives;
public class WorkAroundComboBox: ComboBox
{
FrameworkElement thePopupContent;
public override void OnApplyTemplate()
{
Popup thePopup = GetTemplateChild("Popup") as Popup;
thePopupContent = thePopup.Child as FrameworkElement;
base.OnApplyTemplate();
}
protected override void OnItemsChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
thePopupContent.ClearValue(FrameworkElement.WidthProperty);
thePopupContent.ClearValue(FrameworkElement.HeightProperty);
base.OnItemsChanged(e);
}
}
}
問題は、Silverlight が ComboBox 2 の背後にあるデータが変更されたことを完全には認識していないことだと思います。たぶん追加してみてください OnPropertyChanged("Group2")
のセットに Group1
- これは、Silverlight が ComboBox 2 のバインディングを更新する必要があることを認識するのに役立ちます。
電話するのも役立つかもしれません OnPropertyChanged
のために Group2Selection
, 、以前の値はもう有効ではないためです。