在我的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());
}
}
我们正在执行一些计算,当它在加载时触发时,结果将会出错,我们非常沮丧如何解决这个问题。请提供完整的解决方案。
答案 0 :(得分:1)
检查以下条件对我有用
e.RemovedItems.Count == 0
加载绑定时,此计数为0。
答案 1 :(得分:0)
由于您不使用SelectedValuePath
,我建议您使用SelectedItem
代替SelectedValue
。
无论如何,如果没有选择任何项目,我希望SelectedValue
为null
,这应该在第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
来了解是否必须执行操作。