单击datatemplate中按钮的处理程序不起作用

时间:2017-07-13 14:33:32

标签: c# xaml uwp

我有一个组合了许多数据表的资源字典。我在我的ResourceDictionary.MergedDictionaries中将此资源字典包含为Page.Resources。我的一个datatemplate是ListView,当项目源和项目点击工作正常时,在{datatemplate中设置的ListViewItem上的单独按钮不会调用我的click方法。我不确定如何正确设置。

此click方法在类后面的代码中定义,它定义了包含资源字典的页面Xaml,并使用我的datatemplate进行ListViewItem s。

  • 字典

    • DataTemplates.xaml< - ListView模板,点击页面cs中定义的按钮,即Click="MyPages_ClickMethod"
    • MyPage.xaml
    • MyPage.xaml.cs< - 点击此处定义的方法,MyPages_ClickMethod()

以下是我在datatemplate中设置按钮的方法:

<Button Tag="{Binding id}" Click="MultiShareSelectFileButton_Click" Background="Transparent" Visibility="{Binding multiShareSelected, Converter={StaticResource BooleanToVisibilityConverter}, ConverterParameter=Inverted, Mode=OneWay}">
    <Image Width="27" Source="ms-appx:///Assets/sharePlusIcon@2x.png" VerticalAlignment="Center" HorizontalAlignment="Center">
    </Image>
</Button>

是否可以在不使用ICommand的情况下执行此操作?

类似于:Click="{x:Bind Path=pages:ProductPage.MultiShareSelectFileButton_Click}",但这是抱怨MultiShareSelectFileButton_Click应该是静态的

2 个答案:

答案 0 :(得分:1)

我会对它做出正确的决定。这是问题,

您的DataTemplate位于资源字典中。如果可能的话,资源字典是为样式和转换器而制作的。建议不要将DataTemplate放在资源字典中。

为什么不推荐?

  1. 原因很简单,资源字典用于放置全局数据。例如:您可能希望通过您的应用程序或经常使用的转换器提供的控件样式。
  2. 这是因为您通常会在app.xaml中定义资源字典,该资源字典会在您的初始屏幕出现时运行。
  3. 现在,如果您有很多内容(DataTemplates,样式,转换器)全部定义到<Application.ResourceDictionary> app.xaml BoolToVisibilityConverter部分合并的资源词典中,那么它会产生重大影响在你的应用发布时间,这将破坏用户的体验。
  4. 建议什么?

    1. 建议您保持转换器和样式不是全局的,除非您到处都需要它们。例如:如果您有一个CustomRoundButtonStylepage/userControl,您只能使用<Page.Resources>中的一个DataTemplate。那么加载样式或转换器是没有意义的其他3页。所以你应该在<Page.Resources>中声明它们。
    2. 同样适合您的x:DataType="Models:YourDataContextModel",如果您只想使用一次,可以全局声明它。而是向你的DataTemplate声明它。您的问题将立即解决,因为您的Page将具有代码隐藏功能,因此您的xaml将知道在哪里查找该方法。那是事情出错的地方。
    3. 但是,如果您在以下所有视图中使用单个DataTemplate,那么您的解决方案就是:

      您的解决方案:

      如果您必须在资源字典中使用它,请使用{x:Bind}和 <DataTemplate x:Key="HelloTemplate" x:DataType="yourDefinedNameSpace:YourModel"> <Button Click="{x:Bind GoFetchData}"/> </DataTemplate> YourModel绑定到您的模型。通过这种方式,您的xaml将确切地知道在单击时查找方法的位置。

      以下是它的一个示例:

      namespace

      internal void GoFetchData()存在于case when instr(:P1_USERNAME,'>') > 0 then substr(:P1_USERNAME, 1, instr(:P1_USERNAME,'>')-1) else :P1_USERNAME end 中,定义为&#34; yourDefinedNameSpace&#34;在xaml中它包含一个签名方法:my_pkg.cleanup (:P1_USERNAME)

      我希望这会有所帮助。如果您有任何疑问,请随意使用评论部分

答案 1 :(得分:0)

我发现也有必要在Xaml中指定ClickMode =“ Press”。

<Button Content="&#xE16F;" Focusable="True" FontFamily="Segoe UI Symbol" FontSize="16" Background="{StaticResource HeroLightGray}" Foreground="Black" HorizontalAlignment="Center" VerticalAlignment="Center" 
ClickMode="Press" 
Command="{Binding DataContext.CopyMetadataSourceAsync, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" CommandParameter="{Binding .}" />

我不记得以前必须这样做,但是在花了数小时进行故障排除,将RelayCommand转换为IAsyncCommand等之后,这是唯一可行的方法。实际上,除非我添加了ClickMode =“ Press”,否则我什至无法触发常规的“ Click event”方法背后的代码!

相关问题