Xaml 在Listview';UWP Windows 10中的数据模板

Xaml 在Listview';UWP Windows 10中的数据模板,xaml,win-universal-app,dependency-properties,windows-10-universal,Xaml,Win Universal App,Dependency Properties,Windows 10 Universal,我的中定义了一个共享的弹出按钮,如下所示: <Flyout x:Name="InfoFlyout" Opened="{Binding IsOpen, ElementName=MyListView, Mode=TwoWay}"> <Grid> <Button Foreground="White" Margin="5"> <StackPanel Orientation="Horizontal"&

我的
中定义了一个共享的
弹出按钮,如下所示:

<Flyout x:Name="InfoFlyout" Opened="{Binding IsOpen,
        ElementName=MyListView, Mode=TwoWay}">
    <Grid>
        <Button Foreground="White" Margin="5">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="Help"/>
            </StackPanel>
        </Button>
    </Grid>
</Flyout>
public class OpenFlyoutAction : DependencyObject, IAction
{
    public object Execute(object sender, object parameter)
    {
        FrameworkElement senderElement = sender as FrameworkElement;
        FlyoutBase flyoutBase = FlyoutBase.GetAttachedFlyout(senderElement);

        flyoutBase.ShowAt(senderElement);

        return null;
    }
}
我的
ListView
控件(即x:Name=“MyListView”)绑定到页面的
ViewModel
即MainPageViewModel。IsOpen特性在MainViewModel中定义

现在,在我的
列表视图中,当我按住
列表视图项
或按下
列表视图项
中的按钮时,我希望我的
弹出按钮
打开:

<DataTemplate>
    <Grid FlyoutBase.AttachedFlyout="{StaticResource InfoFlyout}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Image Grid.Column="0" Source={Binding MyImage} />
        <Grid Grid.Column="1" Margin="5">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>
            <Button Width="30" Height="30"
                    Flyout="{StaticResource InfoFlyout}"
                    content="i">
            </Button>
        </Grid>
        <interactivity:Interaction.Behaviors>
            <core:EventTriggerBehavior EventName="Holding">
                <actions:OpenFlyoutAction />
            </core:EventTriggerBehavior>
        </interactivity:Interaction.Behaviors>
    </Grid>
</DataTemplate>
我已经将相同的
弹出按钮
通过以下方式附加到
列表视图项
中的按钮:

Flyout="{StaticResource InfoFlyout}"
我在我的setter和getter上都为IsOpen属性设置了断点,当页面被加载时,它会进入getter,但每当我通过按住
或按“I”按钮打开或关闭我的
弹出按钮时,它不会触发下面的方法,因此不会更改IsOpen属性

private static void OnIsOpenPropertyChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e) as defined in the FlyoutHelper class.
我将我的
ElementName
设置为MyListView的原因是,我希望我的所有
ListViewItem
都绑定到一个属性,即IsOpen,因为每当弹出菜单打开时,我都需要检测它所属的
ListViewItem

我如何实现或解决这个问题

更新-1

使用以下方法解决了访问共享菜单的问题:

<Flyout x:Name="InfoFlyout"
        helpers:FlyoutHelpers.Parent="{Binding ElementName=MyListView}"
        helpers:FlyoutHelpers.IsOpen="{Binding IsOpen, Mode=TwoWay}">
我是否可以停止使用
弹出按钮
,并在用户将手指放在相关
列表视图项
上而不是实际的
列表视图项
的上方或下方时,使用本文提供的相同代码打开我的
弹出按钮

我知道这是一个有点偏离原来的问题,这是分享一个弹出控件,但也可以完成它,因为它是以某种方式相关的问题

谢谢。

作者使用父控件控制弹出按钮的显示位置。 因此,作者有如下代码(FlyoutHelpers.cs):

他使用
弹出型按钮.ShowAt(父项)
让弹出型按钮显示在父元素上。但在代码中,您已使用以下命令将弹出按钮绑定到按钮:


然后,您将在正确的位置看到弹出按钮显示。

将父项的类型从按钮更改为列表视图。要打开特定X、Y位置的弹出按钮,WP中不可能出现。您可以选择弹出控件。这是我得到的一个链接。您可以使用
VisualTreeHelper
获取点击列表视图项的弹出控件

OnIsoPenProperty当IsOpen发生更改时,将触发Changed。由于已绑定自定义等参线特性,因此在弹出按钮打开时必须将其更改为true。你在这么做吗?不,我没有。我认为这样做的目的是,当它通过OnIsOpenPropertyChanged打开时,它会自动更改。我会再看一遍这篇文章,过一会儿再回来。理想情况下,我希望将打开的内置事件绑定并进行相应更改?是自定义等参线属性吗?如果是,则在弹出按钮打开时将viewmodel属性等参线设置为true。因为它是双向绑定的,所以它将触发OnIsOpenPropertyChanged事件。只需检查它是否正在注册OnParentPropertyChanged事件中弹出按钮的打开和关闭事件。您是否已将FlyoutHelpers.cs中attachedProperty“Parent”的类型从Button更改为ListView?起初我犯了那个错误。更正后,一切正常。对不起,我批准得太快了!当通过按钮调用时,这将负责定位,但点击并按住会怎么样?这将触发另一段代码,我将添加它作为问题的更新,但我能否摆脱它并使用与上面相同的方法,如果是,如何?谢谢你,你的水龙头怎么了?有什么问题?@LovetoCode检查更新的答案。我在那里解释问题。谢谢
<Flyout x:Name="InfoFlyout"
        helpers:FlyoutHelpers.Parent="{Binding ElementName=MyListView}"
        helpers:FlyoutHelpers.IsOpen="{Binding IsOpen, Mode=TwoWay}">
<Button Width="30" Height="30"
Command="{Binding InformationCommand}"
CommandParameter="{Binding}"
Flyout="{StaticResource InfoFlyout}">
<DataTemplate>
    <Grid FlyoutBase.AttachedFlyout="{StaticResource InfoFlyout}">
<interactivity:Interaction.Behaviors>
    <core:EventTriggerBehavior EventName="Holding">
        <actions:OpenFlyoutAction />
    </core:EventTriggerBehavior>
</interactivity:Interaction.Behaviors>
public class OpenFlyoutAction : DependencyObject, IAction
{
    public object Execute(object sender, object parameter)
    {
        FrameworkElement senderElement = sender as FrameworkElement;
        FlyoutBase flyoutBase = FlyoutBase.GetAttachedFlyout(senderElement);

        flyoutBase.ShowAt(senderElement);

        return null;
    }
}
private static void OnIsOpenPropertyChanged(DependencyObject d,
        DependencyPropertyChangedEventArgs e)
    {
        var flyout = d as Flyout;
        var parent = (ListView)d.GetValue(ParentProperty);

        if (flyout != null && parent != null)
        {
            var newValue = (bool)e.NewValue;

            if (newValue)
              flyout.ShowAt(parent);
            else
              flyout.Hide();
        }
    }
<Button Width="30" Height="30"
        Flyout="{StaticResource InfoFlyout}" content="i">
</Button>
private static void OnIsOpenPropertyChanged(DependencyObject d,
        DependencyPropertyChangedEventArgs e)
    {
        //var flyout = d as Flyout;
        //var parent = (ListView)d.GetValue(ParentProperty);

        //if (flyout != null && parent != null)
        //{
        //    var newValue = (bool)e.NewValue;

        //    if (newValue)
        //      flyout.ShowAt(parent);
        //    else
        //      flyout.Hide();
        //}
    }