إدارة اختيارات متعددة مع MVVM
-
03-07-2019 - |
سؤال
في رحلتي إلى التعلم MVVM لقد أنشأت بعض الفهم الأساسي WPF و ViewModel نمط.أنا باستخدام التالية التجريد عند تقديم قائمة و أنا مهتم في واحدة من العنصر المحدد.
public ObservableCollection<OrderViewModel> Orders { get; private set; }
public ICollectionView OrdersView
{
get
{
if( _ordersView == null )
_ordersView = CollectionViewSource.GetDefaultView( Orders );
return _ordersView;
}
}
private ICollectionView _ordersView;
public OrderViewModel CurrentOrder
{
get { return OrdersView.CurrentItem as OrderViewModel; }
set { OrdersView.MoveCurrentTo( value ); }
}
ومن ثم يمكنني ربط OrdersView جنبا إلى جنب مع دعم الفرز والتصفية قائمة في WPF:
<ListView ItemsSource="{Binding Path=OrdersView}"
IsSynchronizedWithCurrentItem="True">
هذا يعمل بشكل جيد حقا على واحد اختيار وجهات النظر.ولكن أود أن تدعم أيضا تحديدات متعددة في عرض لدينا نموذج ربط قائمة العناصر المحددة.
كيف يمكنني ربط ListView.SelectedItems إلى مؤيد الملكية على ViewModel?
المحلول
إضافة خاصية IsSelected
لطفلك ViewModel (OrderViewModel
في قضيتك):
public bool IsSelected { get; set; }
وربط الملكية المحدد في الحاوية لهذا (لمربع القائمة في هذه الحالة):
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="IsSelected" Value="{Binding Mode=TwoWay, Path=IsSelected}"/>
</Style>
</ListBox.ItemContainerStyle>
ويتم تحديث IsSelected
لمطابقة الحقل المقابل على الحاوية.
ويمكنك الحصول على الأطفال المحدد في نموذج عرض عن طريق القيام بما يلي:
public IEnumerable<OrderViewModel> SelectedOrders
{
get { return Orders.Where(o => o.IsSelected); }
}
نصائح أخرى
يمكنني أن أؤكد لكم: SelectedItems
هو في الواقع bindable كما XAML CommandParameter
هناك حل بسيط لهذه الشائعة المسألة ؛ أن تجعل من العمل يجب أن تتبع كل القواعد التالية:
التالية إد الكرة اقتراح, على XAML الأمر ربط البيانات ، وتحديد
CommandParameter
السمة قبل علىCommand
السمة. هذه تستغرق وقتا طويلا من الشوائب.تأكد من الخاص بك
ICommand
'sCanExecute
وExecute
أساليب معلمة من نوعobject
.بهذه الطريقة يمكنك منع أسكت يلقي الاستثناءات التي تحدث كلما ربط البيانات هوCommandParameter
نوع لا يطابق الخاص بكCommand
طريقة المعلمة نوع:private bool OnDeleteSelectedItemsCanExecute(object SelectedItems) { // Your code goes here } private bool OnDeleteSelectedItemsExecute(object SelectedItems) { // Your code goes here }
على سبيل المثال ، يمكنك أيضا إرسال ListView
/ListBox
's SelectedItems
الممتلكات الخاصة بك ICommand
الأساليب أو ListView
/ListBox
نفسها.رائع, أليس كذلك ؟
آمل أن يكون هذا يمنع أي شخص من الإنفاق على كمية ضخمة من الوقت لم لمعرفة كيفية الحصول على SelectedItems
كما CanExecute
معلمة.
ويمكن للمرء أن محاولة خلق خاصية المرفقة.
وبذلك سيوفر واحدة من إضافة خاصية IsSelected
عن كل القائمة التي تربط. وقد فعلت ذلك لListBox
، ولكن يمكن تعديلها للاستخدام في في طريقة عرض القائمة.
<ListBox SelectionMode="Multiple"
local:ListBoxMultipleSelection.SelectedItems="{Binding SelectedItems}" >
ومزيد من المعلومات: <لأ href = "http://blogs.microsoft.co.il/miziel/2014/05/02/wpf-binding-listbox-selecteditems-attached-property-vs-style/" يختلط = "نوفولو noreferrer"> WPF - ربط SelectedItems مربع القائمة - المرفقة الملكية VS نمط
إذا كنت تستخدم MVVM-LIGHT يمكنك استخدام هذا النمط:
وليس أنيقة خاصة ولكن يبدو أنه يجب أن تكون موثوقة على الأقل