2

当 TreeViewItem 属性 IsExpanded 更改时,XAML 中是否可以调用函数?

我相信不太好的替代方法是遍历所有 TreeViewItems 并执行 item.IsExpanded += 处理程序调用,如果我理解正确的话。

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

我正在做的是保持树的展开/折叠状态。请先回答第一个问题,然后再提出其他方法来坚持这一点,只是为了让我了解属性和 xaml。

4

2 回答 2

1

基于 Joel 的回答,您可以EventSetter在 TreeViewItemStyle中使用 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 的所有父级获取事件。

于 2013-04-12T18:43:46.077 回答
1

我会使用以下方法将 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.
    }
}
于 2013-04-12T14:08:14.517 回答