【问题标题】:Apply TreeView bindings to non-expanded notes将 TreeView 绑定应用于非扩展注释
【发布时间】:2011-09-28 11:09:08
【问题描述】:

我想使用一个分层的 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,并且只有在可见时才注册委托。

这对我来说是个问题,因为我希望能够以编程方式选择一个项目,即使它的父项尚未展开(例如,我希望能够在树中找到一个节点)。

我想我可以通过编程方式展开和折叠所有节点,但似乎应该有更好的方法。有人可以提出解决方案吗?

【问题讨论】:

    标签: wpf treeview


    【解决方案1】:

    两个建议:

    1) 在选择 m_item2 之前展开 m_item1

    2) 在 ViewModel 中保存您的选择(使用 MVVM 模式)

    【讨论】:

    • 我最终得到了类似于 (1) 的东西(主要是因为我看不到 MVVM 在这里有什么帮助......)。奇怪的是,即使扩展 m_item2 之后,我也可以扩展 m_item1,它仍然有效。所以我可以做类似while (item != null) { item.IsExpanded = true; item = item.Parent; } 的事情。我不明白为什么它会起作用,但它确实......
    猜你喜欢
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多