ComboBox
作为数据源绑定到BindingList<T>
实例,DisplayMember
和ValueMember
属性按预期设置和工作。
在代码的某个点,我将以编程方式切换所选值,给定一个ValueMember
值,这在完美的情况下完美地工作,只需comboBox.SelectedValue = newValue
即可完成。但在其他情况下,提供的newValue
很容易为 null(或者只是数据源中的实际键中没有发生的情况),并且这些情况将以静默方式处理,同时尽可能合理 - 选择要么重置为"未选择"状态,要么重置为某个默认值(例如预配置的值或列表中的第一个值)。但是,如果数据源中也没有出现默认值,或者数据源只是空,该怎么办?ComboBox.SelectedValue
属性不支持将其设置为 null。只是忽略问题,让以前的选择保持不变,正如一些人建议的那样不是一个选项,因为到达这部分代码的事实通常意味着整个情况已经改变,以前的选项集和以前的选择可能碰巧在新上下文中没有或不同的含义。
我刚刚发布了一个关于 SelectedIndex 属性的非常相似的问题的答案:
如何选择/清空数据绑定组合框?选定索引 = -1 不起作用
我在那里发布的解决方法,即设置 FormattingEnabled = true,在设置 SelectedItem = null 时同样有效。
显然,这并不能改变这仍然是一个不受支持的操作的事实,所以如果你担心"保持在线路内",这将无济于事。 但它似乎确实使它在我尝试过的情况下工作,并且由于它为我的代码增加了零复杂性,我发现它是我的用例中非常可接受的解决方法。
您可以使用trycatch
,因此当您的值null
或不存在时,它将抛出异常,因此当抛出异常时,它将转到catch
块
try
{
ComboBox.SelectedValue = null; //this will throw exception
ComboBox.SelectedValue = "text that dont exists" //this will throw exception
}
catch (Exception exception)
{
ComboBox.SelectedValue = "0";
}
因此,在catch
每当抛出exception
时,您都可以将其值设置为"0"
以选择empty
你能不能不使用组合框。选定项替换?它应该返回相同的值,我相信它可以设置为 null。
可以将"默认"值添加到绑定源。
假设您有一个绑定到ComboBox
的ShippingMethod
类
public class ShippingMethod
{
public int Id { get; set; }
public string Name { get; set; }
}
然后,您可以使用"默认"值创建ShippingMethod
实例,并在每次更新值时将其添加到BindingList<ShippingMethod>
。
用于检查给定值是否存在(如果不存在)的使用Dictionary
- 设置默认值
private Dictionary<int, ShippingMethod> _allMethods;
private ShippingMethod _defaultShippingMethod = new ShippiingMethod
{
Id = 0, Name = "Not selected"
}
private void SetUpShippingMethods(IEnumerable<ShippingMethod> methods)
{
_allMethods = methods.ToDictionary(method => method.Id);
var shippingMethods = new List<ShippingMethod> { _defaultShippingMethod };
shippingMethods.AddRange(methods);
_comboBox.ValueMember = "Id";
_comboBox.DisplayMember = "Name";
_comboBox.DataSource= shippingMethods;
}
private void SetSelectedShippingMethod(ShippingMethod method)
{
If (method == null)
{
_comboBox.SelectedValue = _defaultMethod.Id;
return;
}
if (_allMethods.ContainsKey(method.Id))
{
_comboBox.SelectedValue = method.Id;
}
else
{
_comboBox.SelectedValue = _defaultMethod.Id;
}
}
如果您使用MVVM
并且具有属性Methods
和SelectMethod
ViewModel
- 您可以在视图模型中使用相同的方法,但将它们直接设置为ComboBox
,您只需返回"handled"集合或"handled"选定值。
如果您不想在ViewModel
中使用此代码,可以在视图端的Binding.Format
事件中使用它们。