【问题标题】:WP8 LongListMultiSelector Binding SelectedItemsWP8 LongListMultiSelector 绑定 SelectedItems
【发布时间】:2013-08-18 13:42:15
【问题描述】:

我有一个关于 Windows Phone 8 工具包中的 LongListMultiSelector 的问题。

我想用这个控件在 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) 包。

【问题讨论】:

  • 你试过这个你的 ViewModel 应该实现 INotifyPropertyChanged 并在设置器中放置 NotifyPropertyChanged("SelectedFiles");
  • 我的 ViewModel 继承自 BaseViewModel,后者继承自 Mvvmlight 包的 ObservableObject。使用 Set(...) 方法它应该照顾我认为。它至少适用于其他属性。但我不得不承认这是我第一次使用 ObservableCollection,所以可能必须以不同的方式处理。我会调查一下,谢谢。
  • 这里似乎不是问题。我可以编辑集合和 GUI 更新,反之亦然。

标签: c# xaml mvvm binding windows-phone-8


【解决方案1】:

我使用普通的 LongListSelector 解决了我的问题,并为其中的每个 Item 提供了一个 Boolean IsSelected。

DataTemplate 有一个如下所示的复选框:

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

【讨论】:

  • 您好,我也有同样的问题,请告诉我如何在我的代码中使用这个值转换器。提前致谢。
猜你喜欢
  • 1970-01-01
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-10
相关资源
最近更新 更多