سؤال

في رحلتي إلى التعلم 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

هناك حل بسيط لهذه الشائعة المسألة ؛ أن تجعل من العمل يجب أن تتبع كل القواعد التالية:

  1. التالية إد الكرة اقتراح, على XAML الأمر ربط البيانات ، وتحديد CommandParameter السمة قبل على Command السمة. هذه تستغرق وقتا طويلا من الشوائب.

    enter image description here

  2. تأكد من الخاص بك ICommand's CanExecute و 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 يمكنك استخدام هذا النمط:

HTTPS: // galasoft .ch / وظائف / 2010/05 / مناولة datagrid-selecteditems أعوام خلال صديقة للبطريقة MVVM-

وليس أنيقة خاصة ولكن يبدو أنه يجب أن تكون موثوقة على الأقل

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top