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

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

我正在使用 Silverlight 3 和 VS 2008

4

2 回答 2

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 回答
1

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

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

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

HTH,马克

于 2011-01-16T19:56:16.547 回答