将多个字段绑定到MenuFlyoutItem

时间:2015-03-11 19:37:14

标签: c# xaml windows-phone-8.1 windows-8.1

在我的Windows / Windows Phone通用应用程序中,我的XAML布局中有ListView MenuFlyoutListView包含人员列表。点击列表项会显示弹出窗口,其中包含通过电子邮件发送或致电此人的选项。现在我使用Tag的{​​{1}}属性来保存电子邮件地址和电话号码,但我也希望能够获取该人的姓名,以便我在打开时发送该名称电子邮件作曲家或电话拨号器。

我使用MenuFlyoutItem元素存储基本信息,但我想访问该名称。我该怎么做呢?使用额外的属性?以某种方式访问​​父对象的数据绑定?

XAML:

Tag

C#:

<ListView
            x:Name="itemPositions"
            AutomationProperties.AutomationId="ItemListView"
            AutomationProperties.Name="Items In Group"
            TabIndex="1"
            Grid.Row="1"
            ItemsSource="{Binding Positions}"
            SelectionMode="None"
            IsSwipeEnabled="false"
            Margin="0,0,0,0">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid Tapped="Grid_Tapped">
                <FlyoutBase.AttachedFlyout>
                    <MenuFlyout>
                        <MenuFlyoutItem IsEnabled="{Binding IsFilled}" Tag="{Binding Email}" x:Name="sendEmail" Text="email" Click="sendEmail_Click" />
                        <MenuFlyoutItem IsEnabled="{Binding IsFilled}" Tag="{Binding Phone}" x:Name="sendCall" Text="call" Click="sendCall_Click" />
                    </MenuFlyout>
                </FlyoutBase.AttachedFlyout>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="15"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>

                <Border Grid.Column="0" Visibility="{Binding IsVerified, Converter={StaticResource BoolToInvisible}}" Margin="0,0,0,5" Background="Firebrick" Width="10" Height="70" />
                <Border Visibility="{Binding Required, Converter={StaticResource BoolToVisible}}">
                    <Border Grid.Column="0" Visibility="{Binding IsFilled, Converter={StaticResource BoolToInvisible}}" Margin="0,0,0,5" Background="Gold" Width="10" Height="70" />
                </Border>
                <StackPanel Margin="10,0,0,10" Grid.Column="1">
                    <TextBlock Text="{Binding PositionName}" Style="{ThemeResource ListViewItemTextBlockStyle}"/>
                    <TextBlock Text="{Binding DisplayName}" Style="{ThemeResource ListViewItemSubheaderTextBlockStyle}" />
                </StackPanel>
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

1 个答案:

答案 0 :(得分:0)

我很瘦你应该能够做到这一点,例如通过检查点击的 Grid MenuItem DataContext

private void Grid_Tapped(object sender, TappedRoutedEventArgs e)
{
    Item yourItem = (sender as Grid).DataContext as Item;
    FrameworkElement element = sender as FrameworkElement;
    if (element != null) FlyoutBase.ShowAttachedFlyout(element);
}

// you can also do the same in your menu items:

private async void sendEmail_Click(object sender, RoutedEventArgs e)
{
    Item yourItem = (sender as MenuFlyoutItem).DataContext as Item;
    FrameworkElement element = sender as FrameworkElement;
    Windows.ApplicationModel.Email.EmailMessage mail = new Windows.ApplicationModel.Email.EmailMessage();
    mail.Subject = "Leadsheet Position Assignment";
    mail.To.Add(new Windows.ApplicationModel.Email.EmailRecipient(element.Tag.ToString()));
    await Windows.ApplicationModel.Email.EmailManager.ShowComposeNewEmailAsync(mail);
}
上面的

项目是您在 Positions 中设置为ItemsSource的ItemClass。一旦你有了点击的项目,其余的应该很容易。有了这个,您也不再需要绑定 Tag 属性。