c# - ListView SelectedItems 绑定(bind) : why the list is always null

标签 c# xaml binding mvvm-light uwp

我正在使用 Mvvm Light 和 Behaviors SDK 开发 UWP 应用程序。我定义了一个多选的 ListView:

<ListView
    x:Name="MembersToInviteList"
    IsMultiSelectCheckBoxEnabled="True"
    SelectionMode="Multiple"
    ItemsSource="{Binding Contacts}"
    ItemTemplate="{StaticResource MemberTemplate}">

</ListView>

我想要一个绑定(bind)到 MVVM-Light 的按钮RelayCommand , 获取包含所选项目的列表:

<Button
    Command="{Binding AddMembersToEvent}"
    CommandParameter="{Binding ElementName=MembersToInviteList, Path=SelectedItems}"
    Content="Ok"/>

RelayCommand(MVVM-Light 框架):

private RelayCommand<object> _addMembersToEvent;
public RelayCommand<object> AddMembersToEvent
{
    get
    {
        return _addMembersToEvent
            ?? (_addMembersToEvent = new RelayCommand<object>(
               (selectedMembers) =>
               {
                   // Test
                   // selectedMembers is always null!
               }));
    }
}

我在命令中放置了一个断点,我注意到 selectedMembers 始终为 null,尽管我选择了多个项目。通过控制台输出,我没有看到任何绑定(bind)错误或其他错误。

此外,如果我将整个列表作为 CommandParameter 传递,并在命令的定义中放置一个断点,我会注意到我无法访问 SelectedItems 或 SelecteRanges 值。

<DataTemplate x:Name="MemberTemplate">

    <Viewbox MaxWidth="250">
        <Grid Width="250"
              Margin="5, 5, 5, 5"
              Background="{StaticResource MyLightGray}"
              BorderBrush="{StaticResource ShadowColor}"
              BorderThickness="0, 0, 0, 1"
              CornerRadius="4"
              Padding="5">

            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="1*" />
            </Grid.ColumnDefinitions>

            <Grid Grid.Column="0"
                  Width="45"
                  Height="45"
                  Margin="5,0,5,0"
                  VerticalAlignment="Center"
                  CornerRadius="50">

                <Grid.Background>
                    <ImageBrush AlignmentX="Center"
                                AlignmentY="Center"
                                ImageSource="{Binding Image.Url,
                                                      Converter={StaticResource NullGroupImagePlaceholderConverter}}"
                                Stretch="UniformToFill" />
                </Grid.Background>

            </Grid>

            <TextBlock Grid.Column="1"
                       Margin="3"
                       VerticalAlignment="Center"
                       Foreground="{StaticResource ForegroundTextOverBodyColor}"
                       Style="{StaticResource LightText}"
                       Text="{Binding Alias}" />

        </Grid>
    </Viewbox>

</DataTemplate>

这是什么原因?我怎样才能得到这样的列表?

最佳答案

在 igralli 的博客中描述了在 ViewModel(使用 RelayCommands)中从 ListView 传递 SelectedItems 的解决方案之一。

Pass ListView SelectedItems to ViewModel in Universal apps

尝试使用以下代码从参数中获取选定的对象。

    private RelayCommand<IList<object>> _addMembersToEvent;
    public RelayCommand<IList<object>> AddMembersToEvent
    {
        get
        {
            return _addMembersToEvent
                   ?? (_addMembersToEvent = new RelayCommand<IList<object>>(
                       selectedMembers =>
                       {
                           List<object> membersList = selectedMembers.ToList();
                       }));
        }
    }

关于c# - ListView SelectedItems 绑定(bind) : why the list is always null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34822340/

相关文章:

c# - WPF 文本 block 颜色动画

c# - 使用 LINQ-to-SQL 实现 INotifyPropertyChanged

xaml - RichTextBlock、段落、超链接...以及全局化

c# - AvalonDock 绑定(bind)在 DocumentHeaderTemplate 中不起作用

wpf - 键盘焦点的样式触发器

c# - Xamarin.Forms:如何避免在 MVVM 绑定(bind)中对字符串进行硬编码

c# - 将数组解包到方法参数中

c# - MonoGame 中用于碰撞检测的矩形的起源

WPF TextBox 绑定(bind)到十进制尊重文化

java - JBoss 绑定(bind) IP 地址