silverlight中的comboBox并不像一般asp.net的dropdownlist或winform中的comboBox,有selectedValue属性。因为在silverlight中使用comboBox使用selectedItem就基本上满足了需求,如果还不够可以再为相应Tag赋值就OK了。
下面主要说一下为comboBox扩展一个selectedValue属性,其实也很简单,只要为ComboBox注册一个就OK。
1. 一个简单的效果图:
2. 调用方法:
ComboBoxItemValueExtend cbmValueExtend = new ComboBoxItemValueExtend();
cbmValueExtend.SelectionChanged += (sender, arg) =>
{
UI.Alert(cbmValueExtend.SelectedValue);
};
cbmValueExtend.ItemsSource = DepartmentDataSource();
cbmValueExtend.DisplayMemberPath = " Name " ;
cbmValueExtend.SelectedValuePath = " ID " ;
Dialog dlg = new Dialog()
{
Height = 300 ,
Width = 400 ,
Title = " ComboBox's SelectedValue Sample " ,
Content = new AutoGrid( 3 , 60 , 180 )
{
Children =
{
new Label(){Content = " 请选择: " },
cbmValueExtend
}
}
};
dlg.Show();
3. ComboBoxItemValueExtend的实现代码
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Linq;
namespace Top.Windows.Settings
{
public class ComboBoxItemValueExtend : ComboBox
{
#region DependencyProperty: SelectedValuePathProperty-----------------------------------------
public static readonly DependencyProperty SelectedValuePathProperty = DependencyProperty.Register( " SelectedValuePath " , typeof ( string ), typeof (ComboBoxItemValueExtend), null );
/// <summary>
/// Set the name or path of the property that is value for each date item.
/// </summary>
public string SelectedValuePath
{
get
{
return ( string )GetValue(ComboBoxItemValueExtend.SelectedValuePathProperty);
}
set
{
SetValue(ComboBoxItemValueExtend.SelectedValuePathProperty, value);
}
}
#endregion DependencyProperty: SelectedValuePathProperty-----------------------------------------
#region DependencyProperty: SelectedValueProperty-------------------------------------
public static DependencyProperty SelectedValueProperty = DependencyProperty.Register( " SelectedValue " , typeof ( object ), typeof (ComboBoxItemValueExtend), new PropertyMetadata( new PropertyChangedCallback(SelectedValuePropertyChanged)));
/// <summary>
/// Get Selected Value in the comboBox's SelectedItme
/// </summary>
public object SelectedValue
{
get
{
return GetValue(SelectedValueProperty);
}
set
{
try
{
var q = (from item in Items
where item.GetType().GetProperty(SelectedValuePath).GetValue(item, null ).Equals(value)
select item).Single();
SelectedItem = q;
}
catch
{
throw new Exception();
}
}
}
private static void SelectedValuePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
(d as ComboBoxItemValueExtend).SelectedValue = e.NewValue;
}
#endregion DependencyProperty: SelectedValueProperty-------------------------------------
public ComboBoxItemValueExtend()
: base ()
{
base .SelectionChanged += new SelectionChangedEventHandler(ComboBoxItemValueExtend_SelectionChanged);
}
void ComboBoxItemValueExtend_SelectionChanged( object sender, SelectionChangedEventArgs e)
{
if (SelectedItem != null && ! string .IsNullOrEmpty(SelectedValuePath))
{
try
{
SetValue(ComboBoxItemValueExtend.SelectedValueProperty, SelectedItem.GetType().GetProperty(SelectedValuePath).GetValue(SelectedItem, null ));
var value = SelectedValue;
}
catch
{
throw new Exception();
}
}
}
}
}
4. DepartmentDataSource()方法是获取一些测试数据
public struct Department
{
public int ID { set ; get ; }
public int ParentId { set ; get ; }
public string Name { set ; get ; }
public string Description { set ; get ; }
}
public List < Department > DepartmentDataSource()
{
List < Department > list = new List < Department > () {
new Department(){ID = 1 , ParentId = 0 , Name = " Namespace " },
new Department(){ID = 2 , ParentId = 1 , Name = " Class " },
new Department(){ID = 3 , ParentId = 1 , Name = " Enum " },
new Department(){ID = 4 , ParentId = 2 , Name = " Method " },
new Department(){ID = 5 , ParentId = 4 , Name = " Attribute " },
new Department(){ID = 6 , ParentId = 5 , Name = " Private " },
new Department(){ID = 7 , ParentId = 5 , Name = " Publict " },
new Department(){ID = 8 , ParentId = 7 , Name = " DepartmentDataSource() " },
};
return list;
}
谢谢指导!
备注:
关于DependencyProperty的相关知道可以翻阅MSDN学习一下,里面有详细的介绍,这里不再复述!
http://msdn.microsoft.com/zh-cn/library/cc221408.aspx