如何从列表视图中访问页面的datacontext?

时间:2017-07-10 16:35:50

标签: c# xaml listview uwp mvvmcross

我正在使用MVVM Cross来构建UWP应用程序。我无法将命令绑定到按钮。以前在XAML页面中,我使用交互性来绑定其他命令。这里的问题是我们使用listview来呈现用户的“收藏列表”。 UnfavoriteCommand位于ViewModel中但从未被命中,因为User.Favorite列表位于模型中且没有“UnfavoriteCommand”。如何使用MVVM Cross处理此绑定问题?

            <ListView 
                Grid.Row="0"
                Grid.Column="0"
                CanReorderItems="True"
                CanDrag="True"  
                AllowDrop="True"
                ItemsSource="{Binding User.FavoriteList}">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="*" />
                                </Grid.RowDefinitions>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="500" />
                                    <ColumnDefinition Width="*" />
                                </Grid.ColumnDefinitions>
                                <StackPanel Grid.Column="0" Grid.Row="0"
                                        HorizontalAlignment="Left"
                                        Margin="0, 0, 0, 0"
                                        Height="25" >
                                    <TextBlock Text="{Binding Description, Mode=TwoWay}"
                                                   VerticalAlignment="Center"
                                                   TextAlignment="Left"/>
                                </StackPanel>
                                <StackPanel VerticalAlignment="Center" Grid.Column="1" Grid.Row="0">
                                    <Button Content="&#xf00d;" 
                                            FontFamily="{StaticResource FontAwesomeFontFamily}"                                                
                                            BorderBrush="Black">

                                        <Interactivity:Interaction.Behaviors>
                                            <Core:EventTriggerBehavior EventName="Click">
                                                <Core:EventTriggerBehavior.Actions>
                                                    <Core:InvokeCommandAction CommandParameter="{Binding}" Command="{Binding UnfavoriteCommand}"/>
                                                    <!--<Core:CallMethodAction TargetObject="{Binding}" MethodName="Unfavorite" />-->
                                                    <!--<Core:InvokeCommandAction Command="{Binding UnfavoriteCommand}" InputConverter="{StaticResource buttonConverter}"/>-->
                                                </Core:EventTriggerBehavior.Actions>
                                            </Core:EventTriggerBehavior>
                                        </Interactivity:Interaction.Behaviors>
                                    </Button>
                                </StackPanel>
                            </Grid>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>

2 个答案:

答案 0 :(得分:2)

为您的页面命名并使用ElementName绑定。

<Core:InvokeCommandAction CommandParameter="{Binding}" Command="{Binding DataContext.UnfavoriteCommand, ElementName=PageName}"/>

答案 1 :(得分:0)

此代码适用于wpf应用程序,但我认为它与UWP应用程序相同,您应该使用RelativeSource来引用不同的源或上下文,可能是您有一个ViewModel(仅限接口):

public class IAnyViewModel {
     RelayCommand UnfavoriteCommand {get;}
     ObservableCollection<UserFavorite> FavoriteList {get;set;}
}

这个类在构造函数中被分配给页面或窗口控件,或者通过代码分配给这样的东西:

public constructorControl(){
     this.DataContext = new AnyViewModel();
}

或XAML。

<Page.DataContext>
 <local:AnyViewModel></local:AnyViewModel>
</Page.DataContext>

然后你可以使用RelativeSource引用父上下文,如下所示:

<Core:InvokeCommandAction 
    Command="{Binding UnfavoriteCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Page}}">

我假设你的控制权是 Page