1

Web サービスから入力するコンボボックスがあります。

public Configure()
    {
        InitializeComponent();
        WebServiceSoapClient ws = new WebServiceSoapClient();
        ws.GetTypesCompleted += new  EventHandler<GetTypesCompletedEventArgs>(OnGetTypeCompleted);
        ws.GetTypesAsync();
    }

    void OnGetTypeCompleted(object sender, GetTypesCompletedEventArgs e)
    {
        if (e.Result != null)
        {
            List<CodeTableItem> source = e.Result.ToList<CodeTableItem>();
            lstType.ItemsSource = source;
            lstType.SelectedIndex = -1;

        }
    }

そのため、ItemSource プロパティを設定すると、SelectedIndex = 0 で SelectionChanged イベントが発生しますが、ユーザーはまだこの選択を行っておらず、このリストには値が選択されていない必要があるため、SelectedIndex を -1 に設定しています。見る。その結果、SelectionChanged が 2 回呼び出されます。

ユーザーがアイテムを選択したときだけ呼び出されるようにすることはできますか? ありがとう!

Silverlight 3 と VS 2008 を使用しています

4

2 に答える 2

1

このアプリケーションでは、Control.LeftMouseButtonUp() イベントに基づいてブール値フラグを設定するコードを実装しました。これが設定されている場合、ユーザーがフィールドを操作したことを意味するため、別の動作で SelectionChanged を処理できます。

アプリケーションの開発期間中、このアプローチは不可欠でした。これにより、デフォルト バインディングが必要のないときに SelectionChanged ロジックをトリガーできるようになりました。

MVVM の純粋主義者である場合は、VM をメンバー変数として公開し、VM に bool フラグを設定する必要があります。

HTH、マーク

于 2011-01-16T19:56:16.547 に答える
1

代わりに、itemssource と selected インデックスが設定されるまで SelectionChange イベント ハンドラーが定義されないように、コードを変更してください。

void OnGetTypeCompleted(object sender, GetTypesCompletedEventArgs e)
{
    if (e.Result != null)
    {
        List<CodeTableItem> source = e.Result.ToList<CodeTableItem>();
        lstType.ItemsSource = source;
        lstType.SelectedIndex = -1;

        lstType.SelectionChanged += new SelectionChangedEventHandler(lstType_SelectionChanged);

    }
}
于 2011-01-14T19:21:02.633 に答える