2016-11-17 195 views
0

在我的wpf应用程序组合框SelectionChanged事件触发绑定时,如何解决它?如何防止绑定时间(WPf)上的combobox SelectionChanged事件?

<telerik:RadComboBox 
    StaysOpenOnEdit="True" 
    IsSynchronizedWithCurrentItem="True" 
    OpenDropDownOnFocus="True" 
    ItemsSource="{Binding SiteSurveyModel.AtsNumberCollection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
    IsFilteringEnabled="False" 
    IsEditable="False"> 
    <ie:Interaction.Triggers> 
     <ie:EventTrigger EventName="SelectionChanged"> 
      <ie:InvokeCommandAction Command="{Binding ATSRadComboBoxSelectedItemChangedCommand}" CommandParameter="{Binding ElementName=atsRadComboBox}" > 
      </ie:InvokeCommandAction> 
     </ie:EventTrigger> 
    </ie:Interaction.Triggers> 
</telerik:RadComboBox> 

而且

private void BindAtsNumberCollection() 
{ 
    try 
    { 
     List<int> NumberList = new List<int>(); 
     for (int i = 1; i <= 100; i++) 
     { 
      NumberList.Add(i); 
     } 
     SiteSurveyModel.AtsNumberCollection = new ObservableCollectionEx<int>(NumberList); 
    } 
    catch (Exception ex) 
    { 
     customerAC.LogFile(ex.ToString()); 
    } 
} 

和选择变化的方法是

private void onATSRadComboBoxSelectedItemChangedCommand(object obj) 
{ 
    try 
    { 
     RadComboBox atsRadComboBox = obj as RadComboBox; 
     string selectedValue= atsRadComboBox.SelectedValue.ToString(); 
     if (selectedValue.Trim() != string.Empty) 
     { 
      BindAtsData(Convert.ToInt32(selectedValue)); 
     } 
    } 
    catch (Exception ex) 
    { 
     customerAC.LogFile(ex.ToString()); 
    } 
} 

我们正在执行一些计算,当它的发动上加载时间则结果将到来的错误,我们如何解决这个问题非常令人沮丧。请提供完整的解决方案。

+0

好吧,它正在改变,所以防止改变事件听起来像你想隐藏起源于不同部分的问题。 – grek40

+0

嗨grek40,你明白我的问题吗?当页面打开时,事件正在发射,我不想这样。任何解决方案 –

+0

事件发生时没有对选择进行实际更改,或者选择是否在绑定时间上发生了更改?这是两件完全不同的事情,最后你可能不得不更新你的处理程序代码,因为如果不派生你自己的自定义控件,可能无法阻止事件发生。或者如果可能的话,考虑依赖事件的其他组件的可能性被解雇。你不能保证是唯一的听众。 – grek40

回答

0

既然你不使用SelectedValuePath我建议使用SelectedItem而不是SelectedValue

无论如何,如果没有选择项目,我希望SelectedValuenull,这应该在atsRadComboBox.SelectedValue.ToString()螺丝。所以你需要的是一种处理“取消选择”或至少一个简单的检查,取消处理程序而不是尝试ToString和绑定。

private void onATSRadComboBoxSelectedItemChangedCommand(object obj) 
{ 
    try 
    { 
     RadComboBox atsRadComboBox = obj as RadComboBox; 
     if (atsRadComboBox.SelectedValue == null) return; 
     string selectedValue= atsRadComboBox.SelectedValue.ToString(); 
     if (selectedValue.Trim() != string.Empty) 
     { 
      BindAtsData(Convert.ToInt32(selectedValue)); 
     } 
    } 
    catch (Exception ex) 
    { 
     customerAC.LogFile(ex.ToString()); 
    } 
} 

如果您对最小的变化感兴趣,这应该已经做到了。

更一般地,它看起来像你可以引入一个视图模型属性

private int? _selectedNumber 
public int? SelectedNumber 
{ 
    get { return _selectedNumber; } 
    set 
    { 
     _selectedNumber = value; 
     NotifyPropertyChanged("SelectedNumber"); 
     if (_selectedNumber.HasValue) BindAtsData(_selectedNumber.Value); 
     else { /* some kind of de-select needed? */ } 
    } 
} 

通过这个属性直接绑定到RadComboBox.SelectedItem,就没有必要对整个Interaction - EventTrigger解决方法。另外,老实说,我不明白为什么SiteSurveyModel.AtsNumberCollection是双向的。考虑改为单向。

<telerik:RadComboBox 
    Grid.Row="0" Grid.Column="1" 
    Name="atsRadComboBox" 
    Width="150" Height="30" MaxHeight="30" MinHeight="30" 
    Margin="5,0,0,0" 
    HorizontalAlignment="Left" VerticalAlignment="Top" 
    StaysOpenOnEdit="True" 
    OpenDropDownOnFocus="True" 
    IsSynchronizedWithCurrentItem="True" 
    ItemsSource="{Binding SiteSurveyModel.AtsNumberCollection}" 
    SelectedItem={Binding SelectedNumber,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged} 
    IsFilteringEnabled="False" 
    IsEditable="False" 
    IsTextSearchCaseSensitive="False" 
    TextSearchMode="Contains"/> 

补充说明:关于如何使用

SiteSurveyModel.AtsNumberCollection = new ObservableCollectionEx<int>(Enumerable.Range(1, 100)); 
// or if you absolutely need a `List<int>` 
SiteSurveyModel.AtsNumberCollection = new ObservableCollectionEx<int>(Enumerable.Range(1, 100).ToList()); 

更换

List<int> NumberList = new List<int>(); 
for (int i = 1; i <= 100; i++) 
{ 
    NumberList.Add(i); 
} 
SiteSurveyModel.AtsNumberCollection = new ObservableCollectionEx<int>(NumberList); 

这有点更少的代码。

+0

您是对的,我可以返回,但是当我们得到空,在我的情况下,我们得到'1'作为选定的值,请提供更多相关的解决方案。 –

+0

@MatthewSiddle请提供更多相关信息,然后我可以再看看它。但我不知道你的意思是什么*“当我们得到空时,我们得到1作为选定的价值”* – grek40

+0

我说'我们得到1作为选定的值,而不是在绑定时间为null'。所以这种方法在我的情况下是错误的。 if(atsRadComboBox.SelectedValue == null)return; –