我想使用一个分层的TreeView,我将以编程方式填充它。
我的XAML文件如下:
<Window.Resources>
<HierarchicalDataTemplate
DataType="{x:Type local:MyTreeViewItem}"
ItemsSource="{Binding Path=Children}">
<TextBlock Text="{Binding Path=Header}"/>
</HierarchicalDataTemplate>
</Window.Resources>
<Grid>
<TreeView Margin="12,12,422,33" Name="treeView1" SelectedItemChanged="treeView1_SelectedItemChanged" MouseDoubleClick="treeView1_MouseDoubleClick">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
<Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
</Grid>
我遇到的问题是,只有在项目可见时才会应用绑定。
假设我按如下方式填充TreeView:
private ObservableCollection<MyTreeViewItem> m_items;
private MyTreeViewItem m_item1;
private MyTreeViewItem m_item2;
public MainWindow()
{
InitializeComponent();
m_items = new ObservableCollection<MyTreeViewItem>();
m_item1 = new MyTreeViewItem(null) {Header = "Item1"};
m_item2 = new MyTreeViewItem(null) {Header = "Item2"};
m_item1.Children.Add(m_item2);
m_items.Add(m_item1);
treeView1.ItemsSource = m_items;
}
我还有一个选择m_item2的按钮:
private void button2_Click(object sender, RoutedEventArgs e)
{
m_item2.IsSelected = true;
m_item2.IsExpanded = true;
}
现在,如果我启动程序并且TreeView仅显示Item1(Item2被隐藏,因为Item1未展开),则单击该按钮将不会选择m_item2。如果我展开Item1(从而使Item2可见),该按钮将选择m_item2。
检查m_item2上的PropertyChanged事件,我发现它最初设置为null,并且只有一个委托可见时才会注册。
这对我来说是一个问题,因为我希望能够以编程方式选择一个项目,即使它的父项尚未展开(例如我希望能够在树中找到一个节点)。
我想我可以通过编程方式扩展和折叠所有节点,但似乎应该有更好的方法。有人可以提出解决方案吗?
答案 0 :(得分:1)
两个建议:
1)在选择m_item2之前展开m_item1
2)在ViewModel中保存您的选择(使用MVVM-Pattern)