如何在IsExpanded属性改变时调用函数



是否有一种方法在XAML调用一个函数当TreeViewItem属性IsExpanded改变?

我认为不太好的选择是循环遍历所有的treeviewitem并做一个项目。IsExpanded += handler调用,如果我理解正确的话。

或者我可以检查扩展器元素上的点击。

我所做的是持久化树的展开/折叠状态。请回答第一个问题,然后再建议其他方法来持久化它,只是为了在属性和xaml上启发我。

基于Joel的回答,您可以在TreeViewItem Style中使用EventSetter s,它引用代码中的事件处理程序:

<TreeView ... >
    <TreeView.ItemContainerStyle>
        <Style TargetType="TreeViewItem" >
            <EventSetter Event="TreeViewItem.Expanded" Handler="OnTreeExpanded" />
            <EventSetter Event="TreeViewItem.Collapsed" Handler="OnTreeCollapsed" />
        </Style>
    </TreeView.ItemContainerStyle>
    ...

后台代码-正常事件处理程序:

private void OnTreeExpanded(object sender, RoutedEventArgs e)
{
    var tvi = (TreeViewItem)sender;
    ...
    e.Handled = true;
}
private void OnTreeCollapsed(object sender, RoutedEventArgs e)
{
    var tvi = (TreeViewItem)sender;
    ...
    e.Handled = true;
}

注意:确保在事件处理程序中设置e.Handled = true,否则您将从当前TreeViewItem的所有父级获得事件。

我会使用如下方式将TreeViewItem的IsExpanded属性绑定到我的模型:

                    <TreeView.ItemContainerStyle>
                        <Style TargetType="TreeViewItem">
                            <Setter Property="IsSelected" Value="{Binding IsSelected}" />
                            <Setter Property="IsExpanded" Value="{Binding IsExpanded}" />
                        </Style>
                    </TreeView.ItemContainerStyle>

然后我可以运行模型并获得IsExpanded的值并保存它。此外,在恢复时,只需设置IsExpanded属性。

由于在更改时需要调用其他代码,所以像这样实现IsExpanded:

private bool _IsExpanded;
public bool IsExpanded
{
    get { return _IsExpanded; }
    set
    {
        if (_IsExpanded == value) return;
        _IsExpanded = value;
        NotifyPropertyChanged( "IsExpanded" );//or however you need to do it
        CallSomeOtherFunc();//this is the code that you need to be called when changed.
    }
}

最新更新