gpt4 book ai didi

c# - 在 ComboBox 中输入垃圾时将 SelectedValue 设置为 0

转载 作者:行者123 更新时间:2023-11-30 20:35:50 28 4
gpt4 key购买 nike

我有一个简单的组合框,如下所示:

<ComboBox ItemsSource="{DynamicResource ItemsCompColl}" 
TextSearch.TextPath="ItemName"
SelectedValue="{Binding ItemId, UpdateSourceTrigger=PropertyChanged,
ValidatesOnDataErrors=True}" SelectedValuePath="ItemId"
Grid.IsSharedSizeScope="True">

........................

</ComboBox>

效果很好。现在,我正在使用绑定(bind)在 SelectedValue 中的 ItemId 属性来检查用户是否从组合框中选择了合适的项目。

问题:

当用户从 ComboBox 中选择一个值时,ItemId 属性设置为 ComboBox 中所选项目的 ID。之后,如果用户转到下一个控件并返回到 ComboBox 并向 ComboBox 输入一些垃圾值,则 ComboBox 的 ItemId 不会更改,我的意思是它不会重置为“0”。因此,我的验证失败,用户成功输入了垃圾值。

最佳答案

好的,所以当 ComboBox 的可编辑 TextBox 中出现任何验证错误时,您希望将 SelectedValue 设置为 0。您需要检查 Text 的验证结果,如果验证失败,则将您的 SelectedValue 重置为 0。

这是一个适合您的工作示例:

XAML:

<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<StackPanel>
<ComboBox ItemsSource="{Binding ComboboxItems}"
IsEditable="True" DisplayMemberPath="ItemName"
Text="{Binding SelectedName, ValidatesOnDataErrors=True}"
SelectedValue="{Binding SelectedID, UpdateSourceTrigger=PropertyChanged}"
SelectedValuePath="ItemId"
Grid.IsSharedSizeScope="True">
</ComboBox>
<TextBox Text="{Binding SelectedID,UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel>
</Grid>
</Window>

C#:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.ComponentModel;
using System.Collections.ObjectModel;

namespace WpfApplication1
{
public partial class MainWindow : Window
{
MyViewModel mvm;
public MainWindow()
{
InitializeComponent();
mvm = new MyViewModel()
{
ComboboxItems = new ObservableCollection<ComboItem>()
{
new ComboItem{ItemName="item1",ItemId=1},
new ComboItem{ItemName="item2",ItemId=2},
new ComboItem{ItemName="item3",ItemId=3}
},
};
this.DataContext = mvm;
}
}
public class ObservableObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
{
var handler = this.PropertyChanged;
if (handler != null)
{
handler(this, e);
}
}

protected void RaisePropertyChanged(String propertyName)
{
OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
}
}


public class ComboItem : ObservableObject
{
private string _itemname;
private int _itemid;
public string ItemName
{
get
{
return _itemname;
}
set
{
_itemname = value;
RaisePropertyChanged("ItemName");
}
}

public int ItemId
{
get { return _itemid; }
set
{
_itemid = value;
RaisePropertyChanged("ItemId");
}
}
}

public class MyViewModel : ObservableObject, IDataErrorInfo
{
private int _selectedid;
private string _selectedname;
public ObservableCollection<ComboItem> ComboboxItems
{
get;
set;
}


public int SelectedID
{
get { return _selectedid; }
set
{
if (_selectedid != value)
{
_selectedid = value;
RaisePropertyChanged("SelectedID");

}
}
}
public string SelectedName
{
get { return _selectedname; }
set
{
if (_selectedname != value)
{
_selectedname = value;
RaisePropertyChanged("SelectedName");

}
}
}

public string Error
{
get { return this[SelectedName]; }
}

public string this[string columnName]
{
get {

switch (columnName)
{
case "SelectedName":
{
if (SelectedName!=null && ComboboxItems.Count(x => x.ItemName == SelectedName) == 0)
{
//reset selected value to 0
this.SelectedID = 0;
return "Invalid selection";

}
break;
}
}
return null;
}
}
}
}

结果:

当用户输入有效文本(例如 item1)时,下面的 Textbox 显示 SelectedValue 的正确 ItemId,当用户输入无效时文本,所选值将重置为 0。

result

P.S: 当在 ComboBox 中输入垃圾时,它将始终显示验证错误指示器(如上所示的红色边框),并且如果您将 SelectedItem 数据绑定(bind)到属性,它将为空。所以你不应该关心 SelectedValue 如果有错误,这就是为什么我说我不能在评论中重现错误。

关于c# - 在 ComboBox 中输入垃圾时将 SelectedValue 设置为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37569800/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com