c# - WPF 将自定义类事件处理程序添加到 HierarchicalDataTemplate
问题描述
本质上,我遇到的问题是,当我尝试向复选框添加属性以HierarchicalDataTemplate
处理复选框的单击事件时,我无法弄清楚如何分配自定义 ModeNode 的类处理程序onclick(object sender, RoutedEventArgs args)
。我可以分配/创建位于主 Window 类的事件处理程序,这也可以正常工作,但我认为这不是正确的方法。
我的 .xaml 文件看起来像这样
<Window.Resources>
<ResourceDictionary>
<Style x:Key="TreeViewItemStyle" TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="True" />
<Setter Property="IsSelected" Value="{Binding IsInitiallySelected, Mode=OneTime}" />
<Setter Property="KeyboardNavigation.AcceptsReturn" Value="True" />
</Style>
<HierarchicalDataTemplate x:Key="CheckBoxItemTemplate" DataType="{x:Type local:ModelNode}" ItemsSource="{Binding Children, Mode=OneTime}">
<StackPanel Orientation="Horizontal">
<CheckBox
Focusable="False"
IsChecked="{Binding IsChecked}"
VerticalAlignment="Center"
/>
<ContentPresenter
Content="{Binding Name, Mode=OneTime}"
Margin="2,0"
/>
</StackPanel>
</HierarchicalDataTemplate>
</ResourceDictionary>
</Window.Resources>
<Grid Margin="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<TreeView x:Name="SceneTreeView"
ItemContainerStyle="{StaticResource TreeViewItemStyle}"
ItemsSource="{Binding Mode=OneTime}"
ItemTemplate="{StaticResource CheckBoxItemTemplate}">
</TreeView>
</Grid>
这是我用于树视图的数据类型类
public class ModelNode
{
public List<ModelNode> Children { get; set; }
public string Name { set; get; } = "";
public bool IsChecked { get; set; }
public ModelNode(string name)
{
Name = name;
IsChecked = false;
Children = new List<ModelNode>();
}
public void AddChild(ModelNode m)
{
Children.Add(m);
}
public static void onclick(object sender, RoutedEventArgs args)
{
//logic to handle the Click event
}
}
我是 WPF 的新手,所以我可能遗漏了一些东西。
解决方案
ModelNode
应该有一个ICommand
属性,但没有一个事件处理程序。然后,您可以将 的Command
属性绑定CheckBox
到您的ICommand
源属性:
<CheckBox Command="{Binding CommandProperty}"
IsChecked="{Binding IsChecked}"
VerticalAlignment="Center" />
IsChecked
但是您不妨在属性的设置器中处理“事件”逻辑。当您选中或取消选中CheckBox
:
private bool _isChecked;
public bool IsChecked
{
get { return _isChecked; }
set
{
_isChecked = value;
//logic to handle the Click event
}
}
推荐阅读
- php - paginate_links 功能不适用于最新的 WordPress 更新
- ruby-on-rails - Sidekiq 工作人员每两秒显示 'ERROR: heartbeat: "\xE2" from ASCII-8BIT to UTF-8'
- json - 如何使用 jq 从某个嵌套级别删除或忽略值
- mysql - 如何选择用户的所有对话,这些对话还显示最后日期的订单
- reactjs - 如何使用打字稿工作和定义对象的基础属性
- php - 向多个收件人发送消息的 Mailgun 呼叫未返回给呼叫者 - 提供的示例
- r - ggplot2 barplot,其中分类变量具有三个分量
- asp.net-core - 如何将“一般信息”部分添加到 NSwag 生成的 API 文档网站?
- mysql - 我有一个包含不同部分的短语,我需要使用 SQL 将它们拆分,三个不是短语中的分隔符
- c++ - 一个结构的所有对象的条件语句而不写每一个?