当TreeViewItem属性IsExpanded更改时,XAML中是否有一种方法可以调用函数?
我相信不太好的选择是循环遍历所有TreeViewItem并执行item.IsExpanded + =处理程序调用,如果我理解正确的话。
或者我可以检查扩展器元素的点击次数。
我正在做的是保持树的展开/折叠状态。请回答第一个问题,然后再提出其他方法来保持这一点,以便在属性和xaml上进行启发。
答案 0 :(得分: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.
}
}
答案 1 :(得分:1)
基于Joel的回答,您可以在TreeViewItem EventSetter
中使用Style
来引用代码隐藏中的事件处理程序:
<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的所有父项中获取事件。