如何在绑定时间(WPf)上防止组合框SelectionChanged事件?

时间:2016-11-17 11:35:57

标签: c# wpf

在我的wpf应用程序组合框中,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());
    }
}
  

我们正在执行一些计算,当它在加载时触发时,结果将会出错,我们非常沮丧如何解决这个问题。请提供完整的解决方案。

3 个答案:

答案 0 :(得分:1)

检查以下条件对我有用

e.RemovedItems.Count == 0

加载绑定时,此计数为0。

答案 1 :(得分:0)

由于您不使用SelectedValuePath,我建议您使用SelectedItem代替SelectedValue

无论如何,如果没有选择任何项目,我希望SelectedValuenull,这应该在第atsRadComboBox.SelectedValue.ToString()行。所以你需要的是一种处理&#34;取消选择&#34;或至少一个简单的null检查取消处理程序而不是尝试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());
    }
}

如果你对一个微小的变化感兴趣,这应该已经成功了。

更一般地说,看起来你可以引入一个viewmodel属性

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"/>

作为旁注:如何更换

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

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());

它的代码少了一点。

答案 2 :(得分:0)

要解决预防 DialogFragment quizResults = instantiate(mSavedInstanceState); 着火的情况,请在ComboBox.SelectionChanged事件内部,使用SelectionChanged来了解是否必须执行操作。

相关问题