我有一个组合框,我从网络服务填充:
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
答案 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, 标记