如何防止组合框的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());
}
}
我们正在执行一些计算,当它在加载时间发射时,结果将是错误的,我们非常沮丧如何解决这个问题。请提供完整的解决方案。
检查以下条件对我有效,
e.RemovedItems。Count == 0
加载绑定时该计数为0。
由于您不使用SelectedValuePath
,我建议使用SelectedItem
而不是SelectedValue
。
无论如何,如果没有选择项目,我希望SelectedValue
是null
,它应该在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
来知道是否必须做某事