首页 > 解决方案 > 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 的新手,所以我可能遗漏了一些东西。

标签: c#wpfevent-handling

解决方案


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

    }
}

推荐阅读