不同的 ListView 项目启动不同的 Flyout
Different ListView item Launch Different Flyout
我正在寻找一种方法来根据变量 Type
上的值为不同的 ListViewItem 启动不同的 Flyout,目前转换器不工作。
假设我有 1 个转换器、2 个布局和 1 个数据模板。
<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>
当转换器:
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();
}
}
和 ListView:
<ListView
SelectionMode="None" IsItemClickEnabled="True" IsSwipeEnabled="false"
ItemTemplate="{StaticResource ListViewItemTemplate}"
ItemsSource="{Binding}">
</ListView>
和 Grid_Tapped
事件处理程序:
private void Grid_Tapped(object sender, TappedRoutedEventArgs e)
{
FrameworkElement element = sender as FrameworkElement;
if (element != null)
{
FlyoutBase.ShowAttachedFlyout(sender as FrameworkElement);
}
}
是否可以根据 Type
的值启动不同的 Flyout?
谢谢!
你可以使用基于类型的多态性来做到这一点
public object ShowAttachedFlyout(FrameworkElement t)
{
}
public object ShowAttachedFlyout( OtherspecificTYpe o)
{
}
然后动态调用
FlyoutBase.ShowAttachedFlyout((dynamic)sender);
在 Whosebug 闲逛几个小时后,我从 here:
得到了解决它的好主意
我没有使用转换器,而是定义了要附加的弹出窗口并以编程方式在 Grid_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);
}
我正在寻找一种方法来根据变量 Type
上的值为不同的 ListViewItem 启动不同的 Flyout,目前转换器不工作。
假设我有 1 个转换器、2 个布局和 1 个数据模板。
<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>
当转换器:
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();
}
}
和 ListView:
<ListView
SelectionMode="None" IsItemClickEnabled="True" IsSwipeEnabled="false"
ItemTemplate="{StaticResource ListViewItemTemplate}"
ItemsSource="{Binding}">
</ListView>
和 Grid_Tapped
事件处理程序:
private void Grid_Tapped(object sender, TappedRoutedEventArgs e)
{
FrameworkElement element = sender as FrameworkElement;
if (element != null)
{
FlyoutBase.ShowAttachedFlyout(sender as FrameworkElement);
}
}
是否可以根据 Type
的值启动不同的 Flyout?
谢谢!
你可以使用基于类型的多态性来做到这一点
public object ShowAttachedFlyout(FrameworkElement t)
{
}
public object ShowAttachedFlyout( OtherspecificTYpe o)
{
}
然后动态调用
FlyoutBase.ShowAttachedFlyout((dynamic)sender);
在 Whosebug 闲逛几个小时后,我从 here:
得到了解决它的好主意我没有使用转换器,而是定义了要附加的弹出窗口并以编程方式在 Grid_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);
}