2013-08-16 65 views
2

我有一個關於Windows Phone 8工具包中的LongListMultiSelector的問題。WP8 LongListMultiSelector綁定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); } 
    } 
} 

視圖模型

/// <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.SelectedFiles,ref _selectedFiles,value);來自Mvvmlight(Laurent Bugnion)包。
+0

你試過這種的視圖模型應實現INotifyPropertyChanged,並在二傳手把NotifyPropertyChanged(「SelectedFiles」); –

+1

我的ViewModel繼承自BaseViewModel,它從Mvvmlight包中的ObservableObject繼承。使用Set(...)方法,它應該照顧我的想法。 至少適用於其他屬性。 但我不得不承認這是我第一次使用ObservableCollection,所以也許這必須以不同的方式處理。 我會研究它,謝謝。 –

+0

這裏似乎不是問題。我可以編輯集合和GUI更新,反之亦然。 –

回答

0

我解決了我的問題,使用普通的LongListSelector,並給它裏面的每個項目布爾IsSelected。

的DataTemplate中則都有一個複選框,看起來像這樣:

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

嗨我也有同樣的問題,可以請打電話給我如何在我的代碼中使用這個值轉換器。提前致謝。 – Noorul