C# 单击datatemplate中按钮的处理程序不工作

C# 单击datatemplate中按钮的处理程序不工作,c#,xaml,uwp,C#,Xaml,Uwp,我有一个结合了许多数据模板的资源字典。我将此资源字典作为ResourceDictionary.MergedDictionaries包含在我的页面中。Resources。我的数据模板之一是列表视图,当项目源和项目点击正常工作时,数据模板中设置的列表视图项目上的一个单独按钮没有调用我的点击方法。我不确定这个设置是否正确 此单击方法是在代码隐藏类中定义的,该类定义了包含资源字典的页面Xaml,并使用my datatemplate forListViewItems 字典 DataTemplates.

我有一个结合了许多数据模板的资源字典。我将此资源字典作为
ResourceDictionary.MergedDictionaries
包含在我的
页面中。Resources
。我的数据模板之一是
列表视图
,当项目源和项目点击正常工作时,数据模板中设置的
列表视图项目
上的一个单独按钮没有调用我的点击方法。我不确定这个设置是否正确

此单击方法是在代码隐藏类中定义的,该类定义了包含资源字典的页面Xaml,并使用my datatemplate for
ListViewItem
s

  • 字典


    • DataTemplates.xaml我马上开始。问题是

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

      为什么不推荐呢?
    • 原因很简单,资源字典用于放置全局数据。例如:一种你可能希望通过你的应用程序或你经常使用的转换器来使用的控制风格
    • 这是因为通常情况下,您会在
      app.xaml
      中定义资源字典,该字典在您的splashscreen出现时运行
    • 现在,如果你有很多东西(数据模板、样式、转换器)都被定义到资源字典中,这些资源字典被合并到
      app.xaml的一部分中,这将对你的应用程序启动时间产生重大影响,这将破坏你的用户体验
    • 有什么建议?
    • 建议不要让你的转换器和样式全球化,除非你在任何地方都需要它们。例如:如果您有一个
      booltVisibilityConverter
      或一个
      CustomRoundButtonStyle
      ,您只在4个
      页面/用户控件中的一个上使用它。那么为其他3页加载样式或转换器就没有意义了。因此,您应该在
      中声明它们
    • 对于您的
      DataTemplate
      也一样,如果只想使用一次,为什么要全局声明它呢。而是向您的
      声明它。您的问题将立即得到解决,因为您的页面将有一个代码隐藏,因此您的xaml将知道在哪里查找该方法。这就是问题所在 但如果您有一个数据模板用于所有视图,则以下是您的解决方案:

      您的解决方案: 如果您必须在资源字典中使用它,请使用{x:Bind}和
      x:DataType=“Models:YourDataContextModel”
      DataTemplate
      绑定到您的模型。这样,您的xaml就可以在单击时准确地知道在何处查找该方法

      下面是一个例子:

       <DataTemplate x:Key="HelloTemplate" x:DataType="yourDefinedNameSpace:YourModel">
              <Button Click="{x:Bind GoFetchData}"/>
       </DataTemplate>
      
      
      
      其中
      您的模型
      存在于在xaml中定义为“yourDefinedNameSpace”的
      命名空间中,它包含一个签名方法:
      内部void GoFetchData()


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

      我会马上开始。问题是

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

      为什么不推荐呢?
    • 原因很简单,资源字典用于放置全局数据。例如:一种你可能希望通过你的应用程序或你经常使用的转换器来使用的控制风格
    • 这是因为通常情况下,您会在
      app.xaml
      中定义资源字典,该字典在您的splashscreen出现时运行
    • 现在,如果你有很多东西(数据模板、样式、转换器)都被定义到资源字典中,这些资源字典被合并到
      app.xaml
    • 的一部分中,这将对你的应用程序启动时间产生重大影响,这将破坏你的用户体验
    • 有什么建议?
    • 建议不要让你的转换器和样式全球化,除非你在任何地方都需要它们。例如:如果您有一个
      booltVisibilityConverter
      或一个
      CustomRoundButtonStyle
      ,您只在4个
      页面/用户控件中的一个上使用它。那么为其他3页加载样式或转换器就没有意义了。因此,您应该在
      中声明它们
    • 对于您的
      DataTemplate
      也一样,如果只想使用一次,为什么要全局声明它呢。而是向您的
      声明它。您的问题将立即得到解决,因为您的页面将有一个代码隐藏,因此您的xaml将知道在哪里查找该方法。这就是问题所在 但如果您有一个数据模板用于所有视图,则以下是您的解决方案:

      您的解决方案: 如果您必须在资源字典中使用它,请使用{x:Bind}和
      x:DataType=“Models:YourDataContextModel”
      DataTemplate
      绑定到您的模型。这样,您的xaml就可以在单击时准确地知道在何处查找该方法

      下面是一个例子:

       <DataTemplate x:Key="HelloTemplate" x:DataType="yourDefinedNameSpace:YourModel">
              <Button Click="{x:Bind GoFetchData}"/>
       </DataTemplate>
      
      
      
      其中
      您的模型
      存在于在xaml中定义为“yourDefinedNameSpace”的
      命名空间中,它包含一个签名方法:
      内部void GoFetchData()


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

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

      
      
      我不记得以前必须这样做,但在花了数小时排除故障、将RelayCommand转换为IAsyncCommand等之后,这是唯一有效的方法。事实上,我甚至无法在“Click event”方法后面获得一个常规代码来启动,除非我包含ClickMode=“Press”

      I fo
      <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 .}" />