【问题标题】:UWP Master Detail reference parent context from DataTemplateUWP Master Detail 引用来自 DataTemplate 的父上下文
【发布时间】:2018-07-18 02:55:50
【问题描述】:

我无法按照以下草图在 UWP Master/Details 场景中实现删除按钮。

我正在使用以下 XAML 来生成屏幕,它由 ListViewContentPresenter 组成,两者都使用 DataTemplates 绑定到我的视图模型。

<Page.Resources>
  <DataTemplate x:Key="MasterListViewItemTemplate" x:DataType="vm:ListItemViewModel">
    <StackPanel Orientation="Horizontal">
      <SymbolIcon Width="48"
                  Height="48"
                  Symbol="Contact" />
      <TextBlock Margin="8,0"
                 VerticalAlignment="Center"
                 Text="{x:Bind Name, Mode=OneWay}" Style="{ThemeResource BaseTextBlockStyle}" />
    </StackPanel>
  </DataTemplate>
  <DataTemplate x:Key="DetailContentTemplate" x:DataType="vm:ListItemViewModel">
    <RelativePanel HorizontalAlignment="Left">
      <!-- various input controls -->

      <!-- Unable to reference command in parent context here -->
      <Button x:Name="MasterRemoveButton" Padding="12,0" Command="{Binding RemoveCommand}">Remove</button>

    </RelativePanel>
  </DataTemplate>
</Page.Resources>
...
<Grid x:Name="RoleMasterDetailGrid">
  <Grid.ColumnDefinitions>
    <ColumnDefinition x:Name="MasterColumn" Width="Auto" />
    <ColumnDefinition x:Name="DetailColumn" Width="*" />
  </Grid.ColumnDefinitions>

  <ListView x:Name="MasterListView"
            Grid.Column="0"
            IsItemClickEnabled="True"
            ItemTemplate="{StaticResource MasterListViewItemTemplate}"
            ItemsSource="{Binding ListItemViewModels}">
    <ListView.Header>
      <Button x:Name="MasterAddNewButton" Padding="12,0" Command="{Binding AddNewCommand}">
        <StackPanel Orientation="Horizontal">
          <SymbolIcon Width="48"
                      Height="48"
                      Symbol="AddFriend" />
          <TextBlock Margin="8,0"
                     VerticalAlignment="Center"
                     Text="Add" Style="{ThemeResource BaseTextBlockStyle}" />
        </StackPanel>
      </Button>
    </ListView.Header>
  </ListView>

  <ContentPresenter
      x:Name="DetailContentPresenter"
      Grid.Column="1"
      BorderThickness="1,0,0,0"
      Padding="20,16"
      BorderBrush="{ThemeResource SystemControlForegroundBaseLowBrush}"
      Content="{x:Bind MasterListView.SelectedItem, Mode=OneWay}"
      ContentTemplate="{StaticResource DetailContentTemplate}" />

</Grid>

但是,RemoveCommand 命令存在于页面视图模型中,而不是ListItemViewModel,我似乎无法从DataTemplateContentPresenter 中找到引用它的方法。

请有人建议如何从 DataTemplate 中引用父上下文?

【问题讨论】:

    标签: c# uwp uwp-xaml master-detail


    【解决方案1】:

    因此,这可以通过直接引用您知道data context 的元素来实现。它使用Binding ElementName 并且工作得很好,只要你有自己的naming 并且没有在组件之间大量重用templates

    只需从您的代码中替换 button 声明

    <Button x:Name="MasterRemoveButton" Padding="12,0" Command="{Binding RemoveCommand}">Remove</button>
    

    下面的代码

    <Button x:Name="MasterRemoveButton" Content="Remove" Padding="12,0" Command="{Binding ElementName=DetailContentPresenter Path=DataContext.RemoveCommand}"/>
    

    【讨论】:

    • 我不知道这是微不足道的!谢谢
    猜你喜欢
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    • 2012-10-25
    • 2019-05-23
    • 1970-01-01
    • 2021-11-11
    • 2013-01-07
    • 1970-01-01
    相关资源
    最近更新 更多