让ListBox的SelectedItems属性支持数据绑定
2013-07-25 23:15
323 查看
前天学习了李永伦老师的贴子,关于使用附加属性让ListBox的SeletedItems属性支持数据绑定.今天再把代码复习一下.
原文本在点击打开链接
在Visual Studio里,我们可以通过propa这个代码段快速创建附加属性。值得提醒的是,你必须同时提供GetSelectedItems和SetSelectedItems两个方法,否则无法在XAML里读或写这个附加属性的值。
这里通过自定义的依赖属性SelectedItems来实现数据绑定,注意SelectedItems只能更新IList这个对象,当我们手动向数据源添加Item时,是不会更新到ListBox的 ,因为
IList这个接口并不像ObseverbleCollection那样实现了INotifyCollectionChanged和INotifyPropertyChanged接口.
自定义这个附加属性的过程中,我觉得最让人难理解的就是下面这个判断
这个判断是用来处理,重复绑定SelectionChanged事件.
要求当数据源发生第二次改变时,取消对SelectionChanged事件的订阅
xaml
MainPageViewModel
原文本在点击打开链接
在Visual Studio里,我们可以通过propa这个代码段快速创建附加属性。值得提醒的是,你必须同时提供GetSelectedItems和SetSelectedItems两个方法,否则无法在XAML里读或写这个附加属性的值。
这里通过自定义的依赖属性SelectedItems来实现数据绑定,注意SelectedItems只能更新IList这个对象,当我们手动向数据源添加Item时,是不会更新到ListBox的 ,因为
IList这个接口并不像ObseverbleCollection那样实现了INotifyCollectionChanged和INotifyPropertyChanged接口.
自定义这个附加属性的过程中,我觉得最让人难理解的就是下面这个判断
if (e.OldValue != null) { listBox.SelectionChanged -= OnlistBoxSelectionChanged; }
这个判断是用来处理,重复绑定SelectionChanged事件.
要求当数据源发生第二次改变时,取消对SelectionChanged事件的订阅
public class CustomeSelectionItems
{
public static IList GetSelectedItems(DependencyObject obj)
{
return (IList)obj.GetValue(SelectedItemsProperty);
}
public static void SetSelectedItems(DependencyObject obj, IList value)
{
obj.SetValue(SelectedItemsProperty, value);
}
//Using a DependencyProperty as the backing store for SelectedItems. This enables animation, styling, binding, etc...
public static readonly DependencyProperty SelectedItemsProperty =
DependencyProperty.RegisterAttached("SelectedItems", typeof(IList), typeof(CustomeSelectionItems), new PropertyMetadata(OnSelectedItemsChanged));
static public void OnSelectedItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var listBox = d as ListBox;
if ((listBox != null) && (listBox.SelectionMode == SelectionMode.Multiple))
{
if (e.OldValue != null) { listBox.SelectionChanged -= OnlistBoxSelectionChanged; }IList collection = e.NewValue as IList;
listBox.SelectedItems.Clear();
if (collection != null)
{
foreach (var item in collection)
{
listBox.SelectedItems.Add(item);
}
listBox.SelectionChanged += OnlistBoxSelectionChanged;
}
}
}
static void OnlistBoxSelectionChanged(object sender, SelectionChangedEventArgs e)
{
IList dataSource = GetSelectedItems(sender as DependencyObject);
//添加用户选中的当前项.
foreach (var item in e.AddedItems)
{
dataSource.Add(item);
}
//删除用户取消选中的当前项
foreach (var item in e.RemovedItems)
{
dataSource.Remove(item);
}
}
xaml
<ListBox Name="lb" SelectionMode="Multiple" ItemsSource="{Binding list}" local:CustomeSelectionItems.SelectedItems="{Binding SelectedItems}" > <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Vertical"> <TextBlock Text="{Binding Name}"/> <TextBlock Text="{Binding Sex}"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox>
MainPageViewModel
class MainPageViewModel { public ObservableCollection<Item> list { get; set; } public MainPageViewModel() { list = new ObservableCollection<Item>(); list.Add(new Item { Name = "DDDD", Sex = "111", }); list.Add(new Item { Name = "DDDD", Sex = "111", }); list.Add(new Item { Name = "DDDD", Sex = "111", }); list.Add(new Item { Name = "DDDD", Sex = "111", }); list.Add(new Item { Name = "DDDD", Sex = "111", }); SelectedItems = new ObservableCollection<Item>(); SelectedItems.Add(list[0]); } public IList<Item> SelectedItems { get; set; } }
相关文章推荐
- wpf 自定义依赖性属性 作用之一 对数据绑定的支持
- WPF: ListBox绑定xml数据
- WP下数据绑定的数据模板,目标属性…
- 数据绑定控件收藏 DropDownList ListBox GridView DataList Repeater FormView DetailsView
- AspNetAjaxPager,Asp.Net通用无刷新Ajax分页控件,支持多样式多数据绑定
- c#(winform)中自定义ListItem类方便ComboBox和ListBox添加项完全解决(DropDownList 和Combox 数据绑定的常用方法) .
- Android ListView常用属性及数据绑定显示
- CYQ.Data 支持WPF相关的数据控件绑定(2013-08-09)
- Listbox 绑定数据显示System.Data.DataRowView
- 第三天(Vue双向数据绑定,computed属性,动态css绑定)
- 怪异的CheckedListBox数据绑定
- 基础 - 从模板语法数据绑定、指令到计算属性总结
- 转:让旧版本的数据绑定控件支持数据源控件。
- dropdownlist及listbox的数据绑定
- NetBox环境下ajax用get获取数据,中文乱码的问题解决:对象不支持此属性或方法: 'Response.CharSet'
- 稳扎稳打Silverlight(17) - 2.0数据之详解DataGrid, 绑定数据到ListBox
- 关于Asp.Net 服务器控件OnClientClick属性数据绑定
- CYQ.Data 支持WPF相关的数据控件绑定(2013-08-09)
- spring MVC 数据的绑定 验证 转换---属性编辑器
- 动手改造Ibatis,使其支持文件系统存储数据列 之 看我如何给ResultMap增加属性