接触MVVM模式已经有两个月了,关于V-VM这两部分比较好处理,就是那个可恶的Model部分难搞。追根究底,控件的使用不太好办啊。这次遇见“如何在listbox上多项选择,双击添加进另一个listbox”。
(1) View:
添加引用
xmlns:vm="clr-namespace:Project.ViewModel;assembly=Project.ViewModel"
添加控件
<vm:MultipleSelectionListBox Width="180" SelectionMode="Extended" IsSynchronizedWithCurrentItem="True"
SelectedMultipleItems="{Binding SelectedMultipleItems, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
HorizontalAlignment="Left"
ScrollViewer.VerticalScrollBarVisibility="Auto"
ItemsSource="{Binding Items}"
DisplayMemberPath="Name"
SelectedItem="{Binding SelectedItem}" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDoubleClick">
<i:InvokeCommandAction Command="{Binding AddCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</vm:MultipleSelectionListBox>
(2) ViewModel:
添加引用
using System;
using System.Windows;
using System.Windows.Controls;
using System.Collections;
添加属性
private IList _selectedMultipleItems;
public IList SelectedMultipleItems
{
get { return _selectedMultipleItems; }
set
{
_selectedMultipleItems = value;
base.RaisePropertyChanged("SelectedMultipleItems");
}
}
添加控件扩展方法
public class MultipleSelectionListBox : ListBox
{
public IList SelectedMultipleItems
{
get { return (IList)GetValue(SelectedMultipleItemsProperty); }
set { SetValue(SelectedMultipleItemsProperty, value); }
}
public static readonly DependencyProperty SelectedMultipleItemsProperty =
DependencyProperty.Register("SelectedMultipleItems", typeof(IList), typeof(MultipleSelectionListBox), new UIPropertyMetadata(null));
protected override void OnSelectionChanged(SelectionChangedEventArgs e)
{
base.OnSelectionChanged(e);
SelectedMultipleItems = this.SelectedItems;
}
}
本以为方法可行的,当为了保证viewmodel的独立性,把其扩展控件的方法单独挪到一个类库时,才发现viewmodel里多用了一个引用:system.xaml。才使得此方法可行。从MVVM的思想上讲,viewmodel是不能使用这个引用的,破坏了其结构。
留着备用吧。