在gridview中的属性中只有SelectedItem而没有SelectedItems,但是我需要为SelectedItems绑定数据进行操作,该如何去做呢?
我们还可以看到SelectedItems只能读,不能写,又该如何处理呢?
如下是我的解决方式:
写一个behavior重写这个SelectedItems,
public class GridViewSelectedItemsBehavior : Behavior<RadGridView>
{
public INotifyCollectionChanged SelectedItems
{
get { return (INotifyCollectionChanged)GetValue(SelectedItemsProperty); }
set { SetValue(SelectedItemsProperty, value); }
}
public static readonly DependencyProperty SelectedItemsProperty = DependencyProperty.Register("SelectedItems",
typeof(INotifyCollectionChanged), typeof(GridViewSelectedItemsBehavior), new PropertyMetadata(OnSelectedItemsPropertyChanged));
private RadGridView GridView
{
get
{
return AssociatedObject as RadGridView;
}
}
private static void OnSelectedItemsPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
GridViewSelectedItemsBehavior behavior = (GridViewSelectedItemsBehavior)d;
var collection = e.NewValue as INotifyCollectionChanged;
if (collection != null)
{
behavior.UnsubscribeFromEvents();
behavior.Transfer(behavior.SelectedItems as IList, behavior.GridView.SelectedItems);
behavior.SubscribeToEvents();
}
}
protected override void OnAttached()
{
base.OnAttached();
GridView.SelectedItems.CollectionChanged += GridViewSelectedItems_CollectionChanged;
}
private void GridViewSelectedItems_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
UnsubscribeFromEvents();
Transfer(GridView.SelectedItems, SelectedItems as IList);
SubscribeToEvents();
}
public void Transfer(IList source, IList target)
{
if (source == null || target == null)
return;
target.Clear();
foreach (var o in source)
{
target.Add(o);
}
}
private void SubscribeToEvents()
{
GridView.SelectedItems.CollectionChanged += GridViewSelectedItems_CollectionChanged;
}
private void UnsubscribeFromEvents()
{
GridView.SelectedItems.CollectionChanged -= GridViewSelectedItems_CollectionChanged;
}
}
界面调用:
<telerik:RadGridView Grid.Row="1">
<i:Interaction.Behaviors>
<plm:GridViewSelectedItemsBehavior SelectedItems="{Binding MyList}" />
</i:Interaction.Behaviors>
</telerik:RadGridView》