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

本文关键字:定时间 绑定 WPf 事件 SelectionChanged 何防止 组合 | 更新日期: 2023-09-27 18:18:27

在我的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());
    }
}

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

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

检查以下条件对我有效,

e.RemovedItems。Count == 0

加载绑定时该计数为0。

由于您不使用SelectedValuePath,我建议使用SelectedItem而不是SelectedValue

无论如何,如果没有选择项目,我希望SelectedValuenull,它应该在atsRadComboBox.SelectedValue.ToString()行旋转。所以你需要的是一种方法来处理"取消选择"或至少一个简单的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());
    }
}

如果您对最小的更改感兴趣,这应该已经完成了。

更一般地说,你可以引入一个视图模型属性

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

代码少一点

要解决ComboBox.SelectionChanged的防火问题,在SelectionChanged事件中,使用Row.RowState=DataRowState.Modified来知道是否必须做某事