当我分配列表的ItemSource时,如何使我的ListBox不调用SelectionChanged事件

时间:2010-09-09 14:59:42

标签: silverlight-3.0 webservice-client

我有一个组合框,我从网络服务填充:

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属性时,SelectionChanged事件被SelectedIndex = 0触发,但是用户尚未进行此选择,我需要此列表没有选定值,所以我将SelectedIndex设置为-1,如你看到的。结果,SelectionChanged被调用两次。

我可以仅在用户选择项目时才调用它吗? 谢谢!

我正在使用Silverlight 3和VS 2008

2 个答案:

答案 0 :(得分:1)

相反,修改代码,以便在设置itemssource和selected index之后才定义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);

    }
}

答案 1 :(得分:1)

在我们的应用程序中,我们实现了一些代码,这些代码将根据Control.LeftMouseButtonUp()事件设置一个布尔标志。设置此项后,将意味着用户已与字段进行交互,因此我们可以使用不同的行为处理SelectionChanged。

在我们的应用程序的开发生命周期中,这种方法是必不可少的,因此当我们不希望它时,默认绑定会触发SelectionChanged逻辑。

如果您是MVVM纯粹主义者,则需要将VM公开为成员变量,然后在VM中设置bool标志。

HTH, 标记