AutoCompleteBoxとSearchText Clear
-
28-10-2019 - |
質問
これは質問ではありませんが、問題に対する私の答えは、インターネット上で解決策を見つけることができませんでした。
MVVM SilverlightアプリケーションでSearchTextをクリアするのに問題がありました。 SelectedItemとテキストをクリアすることができましたが、検索テキストは残されていました。読み取り専用であり、バインディングで変更することはできません。
例:AutoCompleteBoxは、国のリストを備えています。ユーザーがオーストラリアに参加したいとき、彼らはこの時点で「au」に入ります。その後、ユーザーはオーストラリアを選択して先に進むことができます。編集の最後に、「保存」ボタンをクリックします。この時点で、新しいデータを入力するためにデータFornをクリアしたい可能性があります。
selectedItemとテキストプロパティへのバインディングがあり、それぞれ「null」とstring.emptに設定している場合でも、検索テキストプロパティは残り、AutoCompleteBoxはクリアされますが、「au」が含まれます。
解決
私はインターネット全体にこれについて投稿しましたが、コントロール自体に答えを得ることができなかったので、私のようにイライラする人を助けるかもしれない別の角度からそれに来ました。
Silverlightページをロードするナビゲーションフレームを使用するSilverlight Navigation Templateアプリケーションを使用しています。別のページに移動してデータに戻ると、検索テキストがクリアされたことに気付きました。プロパティに拘束された値は有効なままでしたが、すべてのAutoCompleteBoxで検索テキストだけがクリアされていました。したがって、navigationframeをviewmodelに注入するpageconductor方法を使用して、更新方法を呼び出すことができました。ジョンパパのこの方法を手に入れました 例 Silverlight Firestarterイベントから、iPageConductorインターフェイスに更新メソッドを追加しただけなので、ページをリロードするような「pageConductor.refresh()」を呼び出すことができます。これが誰かを助けてくれることを願っています。
他のヒント
var t = ProductCombo.ItemsSource;
ProductCombo.ItemsSource = null;
ProductCombo.Text = string.Empty;
ProductCombo.SelectedValue = null;
//ProductCombo.Text = string.Empty;
ProductCombo.ItemsSource = t;
これを試してください。それは私のために働いていました
このように、selectedItemバインドプロパティの一部をセットセット内側にテキストにバインドしたプロパティをクリアする必要があります。
public string AnalisisText
{
get { return _analisisText; }
set
{
if (_analisisText == value)
{
return;
}
_analisisText = value;
RaisePropertyChanged(AnalisisTextPropertyName);
}
}
public DatosAutoCompletaPedidosDetalleViewDTO AnalisisSelect
{
get { return _analisisSelect; }
set
{
if (_analisisSelect == value)
{
return;
}
_analisisSelect = value;
if (_analisisSelect == null) AnalisisText = "";
RaisePropertyChanged(AnalisisSelectPropertyName);
}
}
したがって、nullをプロパティSelectedItemに設定すると、他のプロパティは「」に設定されます。
私が見つけた最も簡単な方法は、AutoCompleteBoxを拡張することです。
public class AutoCompleteBoxClear : AutoCompleteBox
{
public AutoCompleteBoxClear()
{
DataContextChanged += (o, e) =>
{
if (SelectedItem == null)
Text = string.Empty;
};
}
}
次に、XAMLで新しいAutoCompleteBoxClearコントロールを使用します。
これにより、AutoCompleteBox DatAcontextがNULLに変更された場合にのみテキストがクリアされます(つまり、ユーザーが[データ]をクリックします。)
注:DataContextChangedはSilverlight 5でのみ利用できると思いますが、最近のSilverlightをまだ使用している人は誰でも今までにアップグレードされていると思います...
var t = productcombo.itemsource; ProductCombo.ItemsSource = null; ProductCombo.Text = String.Empty; ProductCombo.SelectedValue = null; //productcombo.text = string.empty; ProductCombo.ItemsSource = T;
順調に言えば、これはCode-Behindであり、MVVMソリューションが必要でした。
私は最近、WPFアプリで同じ問題を抱えていました。ソリューションは、selectedItemにバインドされたオブジェクトをnullに設定することではなく、デフォルト値に設定することであることがわかりました。これを理解するのに少し時間がかかりました。あなたの例では、そうではありません SelectedCountry = null
, 、 しかし SelectedCountry = new SelectedCountry()
. 。この場合、検索テキストもクリアされています。この問題に関する私のSO投稿を確認してください。 AutoCompleteBoxはキーボードストロークをクリアしません.
SearchTextプロパティは読み取り専用ですが、AutoCompleteBoxの子コンポーネントを取得できます。
var searchText = autoCompBox.GetChildByType<TextBox>(item => item.Name == "Text");
そして、TextBox-Componentのテキストプロパティを介してSearchTextをリセットできます。
if (searchText != null) searchText.Text = string.Empty;
C#6.0では、より臨床的にです:
autoCompBox.GetChildByType<TextBox>(item => item.Name == "Text")?.Text = string.Empty;