MvvmCross Windows Phone 8.1绑定列表选择命令,编译失败

时间:2016-05-05 12:10:53

标签: windows xaml windows-runtime mvvmcross

我发现了以下错误:

  

Windows.UI.Xml.Controls.ListView类型的对象无法转换为System.Windows.DependencyObject类型

由于以下代码:

<ListView Grid.Row="1" ItemsSource="{Binding Cases}" IsItemClickEnabled="False" SelectionMode="Single">
    <ListView.ItemTemplate>
    <DataTemplate>
        <Grid>
                <TextBlock Text="{Binding Subject}" HorizontalAlignment="Left"></TextBlock>
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <i:InvokeCommandAction Command="{Binding ShowCaseCommand, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</ListView>

我将EventTrigger添加到名称空间中,如下所示:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

我通过从C:\Program Files (x86)\Microsoft SDKs\Expression\Blend\.NETFramework\v4.5\Libraries\System.Windows.Interactivity.dll手动添加引用,将“交互”添加到项目中。

当然删除<i:Interaction.Triggers>块会消除错误,但我需要将选择绑定到命令,就像我在UIKit和Android中那样。

那么 - 这是什么样的魔鬼?

1 个答案:

答案 0 :(得分:0)

问题是此代码与Windows Phone 8.1不兼容。

列表视图需要像这样设置:

<ListView Grid.Row="1" ItemsSource="{Binding Cases}"  IsItemClickEnabled="False" SelectionMode="Single">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid>
                <TextBlock Text="{Binding Subject}" HorizontalAlignment="Left"></TextBlock>
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
    <interactivity:Interaction.Behaviors>
        <core:EventTriggerBehavior EventName="SelectionChanged">
            <core:InvokeCommandAction Command="{Binding ShowCaseCommand, Mode=OneWay}" />
            </core:EventTriggerBehavior>
    </interactivity:Interaction.Behaviors>
</ListView>

需要添加对Behaviors库的引用,而不是Windows.Interaction。

上述代码在根节点上需要以下属性:

xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
xmlns:core="using:Microsoft.Xaml.Interactions.Core"

这导致另一个问题; 虽然它将绑定到ShowCaseCommand,但它将传递SelectionChangedEventArgs的实例,而不是选定的列表项。

我们使用CommandParameter来解决此问题。

我们向ListView添加了一个属性,就像这样 - <ListView Name='listView' ... - 此名称允许我们稍后引用它:

<interactivity:Interaction.Behaviors>
    <core:EventTriggerBehavior EventName="SelectionChanged">
        <core:InvokeCommandAction Command="{Binding ShowCaseCommand, Mode=OneWay}" CommandParameter="{Binding ElementName=listView, Path=SelectedItem}" />
    </core:EventTriggerBehavior>
</interactivity:Interaction.Behaviors>

通过像这样指定命令参数,我们可以将所选项目作为参数传递,使其与iOS中使用的相同类型的选择命令兼容。