C# 单击datatemplate中按钮的处理程序不工作
我有一个结合了许多数据模板的资源字典。我将此资源字典作为C# 单击datatemplate中按钮的处理程序不工作,c#,xaml,uwp,C#,Xaml,Uwp,我有一个结合了许多数据模板的资源字典。我将此资源字典作为ResourceDictionary.MergedDictionaries包含在我的页面中。Resources。我的数据模板之一是列表视图,当项目源和项目点击正常工作时,数据模板中设置的列表视图项目上的一个单独按钮没有调用我的点击方法。我不确定这个设置是否正确 此单击方法是在代码隐藏类中定义的,该类定义了包含资源字典的页面Xaml,并使用my datatemplate forListViewItems 字典 DataTemplates.
ResourceDictionary.MergedDictionaries
包含在我的页面中。Resources
。我的数据模板之一是列表视图
,当项目源和项目点击正常工作时,数据模板中设置的列表视图项目
上的一个单独按钮没有调用我的点击方法。我不确定这个设置是否正确
此单击方法是在代码隐藏类中定义的,该类定义了包含资源字典的页面Xaml,并使用my datatemplate forListViewItem
s
- 字典
- DataTemplates.xaml我马上开始。问题是
您的
位于资源字典中。如果可以的话,资源字典是为样式和转换器制作的。不建议将DataTemplate
放入资源字典中 为什么不推荐呢?DataTemplate
- 原因很简单,资源字典用于放置全局数据。例如:一种你可能希望通过你的应用程序或你经常使用的转换器来使用的控制风格李>
- 这是因为通常情况下,您会在
中定义资源字典,该字典在您的splashscreen出现时运行app.xaml
- 现在,如果你有很多东西(数据模板、样式、转换器)都被定义到资源字典中,这些资源字典被合并到
app.xaml的一部分中,这将对你的应用程序启动时间产生重大影响,这将破坏你的用户体验
有什么建议?
- 建议不要让你的转换器和样式全球化,除非你在任何地方都需要它们。例如:如果您有一个
或一个booltVisibilityConverter
,您只在4个CustomRoundButtonStyle
页面/用户控件中的一个上使用它。那么为其他3页加载样式或转换器就没有意义了。因此,您应该在
中声明它们李>- 对于您的
有什么建议?
也一样,如果只想使用一次,为什么要全局声明它呢。而是向您的DataTemplate
声明它。您的问题将立即得到解决,因为您的页面将有一个代码隐藏,因此您的xaml将知道在哪里查找该方法。这就是问题所在李> 但如果您有一个数据模板用于所有视图,则以下是您的解决方案: 您的解决方案: 如果您必须在资源字典中使用它,请使用{x:Bind}和
将x:DataType=“Models:YourDataContextModel”
绑定到您的模型。这样,您的xaml就可以在单击时准确地知道在何处查找该方法 下面是一个例子:DataTemplate
<DataTemplate x:Key="HelloTemplate" x:DataType="yourDefinedNameSpace:YourModel"> <Button Click="{x:Bind GoFetchData}"/> </DataTemplate>
其中
存在于在xaml中定义为“yourDefinedNameSpace”的您的模型
的一部分中,这将对你的应用程序启动时间产生重大影响,这将破坏你的用户体验命名空间中,它包含一个签名方法:
内部void GoFetchData()
我希望这有帮助。如果您有任何疑问,请随时使用评论部分我会马上开始。问题是 您的
位于资源字典中。如果可以的话,资源字典是为样式和转换器制作的。不建议将DataTemplate
放入资源字典中 为什么不推荐呢?DataTemplate
- 原因很简单,资源字典用于放置全局数据。例如:一种你可能希望通过你的应用程序或你经常使用的转换器来使用的控制风格李>
- 这是因为通常情况下,您会在
中定义资源字典,该字典在您的splashscreen出现时运行app.xaml
- 现在,如果你有很多东西(数据模板、样式、转换器)都被定义到资源字典中,这些资源字典被合并到
app.xaml- 建议不要让你的转换器和样式全球化,除非你在任何地方都需要它们。例如:如果您有一个
或一个booltVisibilityConverter
,您只在4个CustomRoundButtonStyle
页面/用户控件中的一个上使用它。那么为其他3页加载样式或转换器就没有意义了。因此,您应该在
中声明它们李>- 对于您的
也一样,如果只想使用一次,为什么要全局声明它呢。而是向您的DataTemplate
声明它。您的问题将立即得到解决,因为您的页面将有一个代码隐藏,因此您的xaml将知道在哪里查找该方法。这就是问题所在李> 但如果您有一个数据模板用于所有视图,则以下是您的解决方案: 您的解决方案: 如果您必须在资源字典中使用它,请使用{x:Bind}和
将x:DataType=“Models:YourDataContextModel”
绑定到您的模型。这样,您的xaml就可以在单击时准确地知道在何处查找该方法 下面是一个例子:DataTemplate
<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="" 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 .}" />
- 对于您的
- DataTemplates.xaml我马上开始。问题是
您的