在.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绑定到属性。