.NET 4.0 中SelectedItem与SelectedValue的使用

.NET开发中,经常需要处理列表控件中的选定项。SelectedItem和SelectedValue是两个非常有用的属性,可以帮助实现这一功能。本文将详细介绍这两个属性的使用方法,并提供一个示例代码,以便读者更好地理解和应用。

当然,一个示例代码的价值远超过一千张图片。因此,鼓励下载下面的示例代码,并亲自尝试。

SelectedItem属性返回当前在列表/组合框/容器中选定的项。这是一个对象,因为可以看到(因为列表包含对象)。如果列表/组合框等包含字符串列表,它将是字符串。如果包含整数,它将是整数。

SelectedValuePath属性设置后,SelectedValue属性将返回在这里选择的属性的值。在示例中,选择"ShapeColor"将使SelectedValue仅返回颜色,而不是整个形状对象。

DisplayMemberPath属性设置为对象的属性,将导致GUI在选中类时显示该属性,而不是看到类名或类ToString()方法(应该始终提供)。

使用代码

尽量保持代码简单且简短,同时提供足够的功能以引起兴趣。使用了一个简单的XAML文件和一些代码后置,总共大约200行代码(包括空格和一些注释)。

MainWindow.xaml文件包含一个DockPanel,底部有一个页脚,一个StackPanel将填充窗口(默认情况下最后一个子元素会这样做)。

使用的结构是一个名为MyShape的虚拟类,如下所示:

public class MyShape { public string ShapeType { get; set; } public string ShapeColor { get; set; } public int ShapeSides { get; set; } }

GetShapesList()方法将用类似以下对象填充形状列表:

return new ObservableCollection { new MyShape { ShapeType = "Circle", ShapeColor = "Blue", ShapeSides = 0 }, new MyShape { ShapeType = "Triangle", ShapeColor = "Yellow", ShapeSides = 3 }, // ... };

PropertiesList是通过以下方式填充的:

private static ObservableCollection GetPropertiesList() { ObservableCollection return_collection = new ObservableCollection { new PropertyObject { PropertyName = "", PropertyType = "Reset to default" } }; var propertiesInfos = typeof(MyShape).GetProperties(); foreach (var propertyInfo in propertiesInfos) { return_collection.Add(new PropertyObject { PropertyName = propertyInfo.Name, PropertyType = propertyInfo.PropertyType.Name }); } return return_collection; }

PropertyObject是一个简单的类,用于保存正在处理的属性的名称和类型(两者都是字符串)。

public class PropertyObject { public string PropertyName { get; set; } public string PropertyType { get; set; } }

首先,添加一个空的,以便当选择时,它将"重置"绑定到默认值。然后使用反射来找到MyShape类上的所有属性,这样就可以从ComboBox中选择它们。

SelectionChanged事件简单地根据所选内容设置ListBox源属性(在XAML中称之为SourceListBox)。例如:

private void DisplayMemberPathCmbx_SelectionChanged(object sender, SelectionChangedEventArgs e) { ComboBox cmbx = (ComboBox)sender; PropertyObject prop_ob = ((PropertyObject)cmbx.SelectedItem); string name = prop_ob.PropertyName; SourceListBox.DisplayMemberPath = name; }

就是这样!下载代码并亲自尝试,看看它是如何工作的。

注意事项

通常倾向于使用MVVM,但为了保持代码简洁,选择了代码后置方法。注意使用反射动态获取属性及其类型,以及如何使用名称将XAML绑定到属性。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485