UWP - 如何将ContentPresenter的元素绑定到主ViewModel?

时间:2016-10-03 15:35:47

标签: xaml mvvm binding uwp viewmodel

我在一个用户可以编辑“大”形式的应用程序上工作:

  • 表单包含许多字段:它显示在数据透视中,其中每个数据透视表代表表单的类别。
  • 某些类别包含一个或多个子项:它们通过 Master-Detail 演示文稿显示。

要显示详细信息部分的项目,我使用直接绑定到模型的 ContentPresenter

<ContentPresenter
    x:Name="DetailContentPresenter"
    Grid.Column="1"
    Grid.RowSpan="2"
    BorderThickness="1,0,0,0"
    Padding="24,0"
    BorderBrush="{ThemeResource SystemControlForegroundBaseLowBrush}"
    Content="{x:Bind MasterListView.SelectedItem, Mode=OneWay}">

    <ContentPresenter.ContentTemplate>
        <DataTemplate x:DataType="models:Form_Parts">
            <...>
        </DataTemplate>
    </ContentPresenter.ContentTemplate>
</ContentPresenter>

这很好用,但主表单中有一个“第三”级别:我通过 GridView 在ContentPresenter中显示的照片列表。这也很好,但我想使用“添加”按钮或“ItemClick”事件与照片进行交互:我看不出如何在主ViewModel中绑定Command,而不是ContentPresenter的DataContext。此表单的其他字段在此ViewModel上绑定良好。

我做了一些没有任何结果的测试:

<StackPanel Orientation="Horizontal" Grid.Row="1">
    <GridView ItemsSource="{Binding images}"
              ItemClick="{Binding PhotoClickCommand}">
        <GridView.ItemTemplate>
            <DataTemplate>
                <Border BorderBrush="Gray" BorderThickness="1" 
                        Padding="10"
                        Height="150" Width="190">
                    <Image Stretch="UniformToFill"
                           Source="{Binding bitmap_image}" />
                </Border>
            </DataTemplate>
        </GridView.ItemTemplate>
    </GridView>
    <Border BorderBrush="Gray" BorderThickness="1" 
            Padding="10"
            Height="150" Width="190">
        <Button Command="{Binding Path=DataContext.AddPhotoCommand, ElementName=DetailsPage}" 
                Height="100" Width="100">
            <Viewbox>
                <SymbolIcon Symbol="Add"/>
            </Viewbox>
        </Button>
    </Border>
</StackPanel>

=&GT;有没有办法做到这一点?

修改: 我解决了“添加”按钮的问题,感谢Alteik:

<Button Command="{Binding ElementName=Root, Path=DataContext.AddPhotoCommand}" Height="100" Width="100">

但我总是遇到 GridView ItemClick 的问题。我试过这个:

<GridView ItemsSource="{Binding images}"
          IsItemClickEnabled="True"
          SelectionMode="None">
    <i:Interaction.Behaviors>
        <core:EventTriggerBehavior EventName="Tapped">
            <core:InvokeCommandAction Command="{Binding ElementName=Root, Path=DataContext.EditPhotoCommand}" 
                                      CommandParameter="{Binding Mode=OneWay}"/>
        </core:EventTriggerBehavior>
    </i:Interaction.Behaviors>
    <...>
</GridView>

但是我没有在ViewModel中获得预期的参数:

private void EditPhoto(object sender)
{
    Images sImage = (Images)sender;
    if (sImage != null)
    {
        NavigationService.NavigateTo<CommentImageViewModel>(this, new Object[] { sImage }, true);
    }
}

发件人是当前的 Form_Parts (ContentPresenter的DataTemplate),而我会得到我的图片集合中的选定项目,绑定到GridView ...

=&GT;我可以做些什么来解决这个问题?

1 个答案:

答案 0 :(得分:1)

您应该能够在子元素中更改DataContext:

Command"{Binding ElementName=Root, Path=DataContext.TheCommandFromRoot}"

显然你需要将父元素的名称设置为&#34; Root&#34;