2013-08-16 2 views
2

У меня есть вопрос относительно LongListMultiSelector в наборе инструментов Windows Phone 8.WP8 LongListMultiSelector Binding SelectedItems

Я хочу использовать этот элемент управления для реализации файлового браузера в WP8 (с использованием MVVM). Поскольку свойство SelectedItems не является связующим, я использовал решение этой статьи, чтобы исправить это. http://dotnet-redzone.blogspot.de/2012/11/windows-phone-8longlistselector.html

Вот мой соответствующий код: XAML

<Grid DataContext="{Binding FileBrowserViewModel}"> 
    <local:LongListMultiSelector 
        x:Name="FileList" 
        ItemsSource ="{Binding CurrentFileList}" 
        EnforceIsSelectionEnabled="{Binding IsInSelectionMode}" 
        toolkit:TiltEffect.IsTiltEnabled="True" 
        SelectedItems="{Binding SelectedFiles, Mode=TwoWay}" 
        IsSelectionEnabled="True"/> 

</Grid> 

Мой LonglistMultiSelector

public class LongListMultiSelector : Microsoft.Phone.Controls.LongListMultiSelector 
{ 
    public LongListMultiSelector() 
    { 
     SelectionChanged += LongListMultiSelector_SelectionChanged; 
    } 

    void LongListMultiSelector_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) 
    { 
     this.SelectedItems = base.SelectedItems; 
    } 

    public static readonly DependencyProperty SelectedItemsProperty = 
     DependencyProperty.Register(
      "SelectedItems", 
      typeof(object), 
      typeof(LongListMultiSelector), 
      new PropertyMetadata(null, OnSelectedItemsChanged) 
     ); 

    private static void OnSelectedItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var selector = (LongListMultiSelector) d; 
     selector.SelectedItems = e.NewValue; 
    } 

    public new object SelectedItems 
    { 
     get { return GetValue(SelectedItemsProperty); } 
     set { SetValue(SelectedItemsProperty, value); } 
    } 
} 

VIEW МОДЕЛЬ

/// <summary> 
/// The currently selected Items. 
/// </summary> 
public ObservableCollection<File> SelectedFiles 
{ 
    get { return _selectedFiles; } 
    set { Set(() => this.SelectedFiles, ref _selectedFiles, value); } 
} 
private ObservableCollection<File> _selectedFiles; 

Но это решение не работает. Свойство SelectedFiles не изменяется вообще. (_selectedFiles всегда равно нулю)

  • Редактировать: Set (() => this.SelectFiles, ref_selectedFiles, value); из пакета Mvvmlight (Laurent Bugnion).
+0

вы пробовали это ваш ViewModel будет реализует INotifyPropertyChanged и в инкубаторе положить NotifyPropertyChanged («SelectedFiles»); –

+1

My ViewModel наследует от BaseViewModel, который унаследован от ObservableObject из пакета Mvvmlight. Используя метод Set (...), он должен позаботиться о том, что я думаю. Он работает для других свойств как минимум. Но я должен признать, что это первый раз, когда я использую ObservableCollection, поэтому, возможно, это нужно обрабатывать по-разному. Я посмотрю, спасибо. –

+0

Здесь, похоже, не проблема. Я могу редактировать коллекцию и обновления графического интерфейса и наоборот. –

ответ

0

Я решил свою проблему с помощью обычного LongListSelector и предоставления каждому элементу внутри него логического IsSelected.

DataTemplate то есть флажок, который выглядит следующим образом:

<CheckBox IsChecked="{Binding IsSelected, Converter={StaticResource BooleanToVisibilityConverter}}"/> 
+0

Привет, у меня тоже такая же проблема, можете просить меня, как я могу использовать этот преобразователь значений в своем коде. Заранее спасибо. – Noorul