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();
//}
}