简体   繁体   English

不同的ListView项目启动不同的弹出

[英]Different ListView item Launch Different Flyout

I am looking for a way to launch different Flyout for different ListViewItem depending on the value on variable Type , and currently the converter is not working. 我正在寻找一种方法,以根据变量Type的值为不同的ListViewItem启动不同的Flyout,并且当前转换器无法正常工作。

Let's say I have 1 Converter, 2 Flayouts, and 1 DataTemplate. 假设我有1个Converter,2个Flayouts和1个DataTemplate。

<Page.Resources>
    <common:TypeToFlyoutTypeConverter x:Key="typeToFlyoutConverter"/>
    <Flyout x:Name="FlyoutTemplateConfirmed">
        <Grid >
            <TextBlock Text="Confirmed"/>
        </Grid>
    </Flyout>
    <Flyout x:Name="FlyoutTemplateRejected">
        <Grid >
            <TextBlock Text="Rejected"/>
        </Grid>
    </Flyout>
    <DataTemplate x:Key="ListViewItemTemplate">
        <Grid Tapped="Grid_Tapped" 
              FlyoutBase.AttachedFlyout="{Binding Type, Converter={StaticResource typeToFlyoutConverter}}">
        </Grid>
    </DataTemplate>
</Page.Resources>

While the Converter: 而转换器:

public class TypeToFlyoutTypeConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if ((value as String).Contains("TypeConfirmed"))
            return "StaticResource FlyoutTemplateConfirmed";
        else
            return "StaticResource FlyoutTemplateRejected";
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotSupportedException();
    }
}

And the ListView: 和ListView:

<ListView
    SelectionMode="None" IsItemClickEnabled="True" IsSwipeEnabled="false"
    ItemTemplate="{StaticResource ListViewItemTemplate}"
    ItemsSource="{Binding}">
</ListView>

And the Grid_Tapped Event Handler: Grid_Tapped事件处理程序:

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

Is it possible to launch different Flyout based on the value of Type ? 是否可以根据Type的值启动不同的Flyout?

Thank you! 谢谢!

you could do it using polymorphism based on type 你可以使用基于类型的多态

public object ShowAttachedFlyout(FrameworkElement t)
{

}
public object ShowAttachedFlyout( OtherspecificTYpe o)
{

}

And then call it with dynamic 然后用动态调用

FlyoutBase.ShowAttachedFlyout((dynamic)sender);

After few hours of wandering around stackoverflow, I got quite a good idea to solve it from here : 在徘徊了几个小时的stackoverflow之后,我有了一个很好的主意来解决这个问题

Instead of using converter, I define which flyout to attach and show it programmatically on Grid_Tapped : 我不使用转换器,而是定义要附加的弹出Grid_Tapped并在Grid_TappedGrid_Tapped编程方式显示它:

    private void Grid_Tapped(object sender, TappedRoutedEventArgs e)
    {
        string itemType = ((sender as Grid).DataContext as blabla).Type;

        if (itemType.Contains("blibli") && (sender as FrameworkElement) != null)            
            FlyoutBase.SetAttachedFlyout(sender as FrameworkElement, (Flyout)this.Resources["FlyoutTemplateConfirmed"]);
        else if ((sender as FrameworkElement) != null)            
            FlyoutBase.SetAttachedFlyout(sender as FrameworkElement, (Flyout)this.Resources["FlyoutTemplateRejected"]);

        FlyoutBase.ShowAttachedFlyout(sender as FrameworkElement);
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM