1

在 WPF 中,我有一个绑定到分层列表的树视图。当我想在树中插入一个新节点并编辑该新节点的名称(如 Windows 中的文件夹树视图)时,我无法以编程方式选择新节点。我可以选择父节点,甚至可以在插入后选择新节点。但我想在插入新节点时选择新节点。

<HierarchicalDataTemplate x:Key="hierarchi" ItemsSource="{Binding Path=Items}" >
        <StackPanel Orientation="Horizontal" Margin="2" MouseLeftButtonDown="Item_MouseLeftButtonDown" Tag="{Binding}" >
            <Image  Name="itemImage" Source="{Binding Path=Image}"  Height="16" Width="16"/>
            <TextBlock Name="textBlockName" VerticalAlignment="Center" Text="{Binding Path=Name}" FontFamily="Tahoma" FontSize="12" />
            <TextBox Name="textBoxName" VerticalAlignment="Center" Text="{Binding Path=Name,Mode=TwoWay}" Visibility="Hidden"  FontFamily="Tahoma" FontSize="12" KeyDown="textBoxName_KeyDown" LostFocus="textBoxName_LostFocus"/>
        </StackPanel>          
</HierarchicalDataTemplate>

我的数据模型是这样的:

public class Model:INotifyPropertyChanged
    {
        //other methods and properties are removed.


        private string name;
        public string Name
        {
            get { return name; }
            set { name = value;
            OnPropertyChange("Name");
            }
        }

        private ObservableCollection items = null;
        public ObservableCollection Items
        {
            get { return items; }
            set { items = value;
            OnPropertyChange("Items");
            }
        }
}

这是添加节点的代码:

private void buttonNew_Click(object sender, RoutedEventArgs e)
    {
        if (treeView.SelectedItem is Model)
        {
            Model parent= (Model)treeView.SelectedItem;

            Model newItem = new Model();
            newItem.Parent = post;
            newItem.Name = "New";
            newItem.ParentID = parent.ID;
            parent.Items.Add(newItem);


            TreeViewItem item = GetTreeViewItem(newItem);

            //problem is here, item is null.
            if(item!=null)
                item.IsSelected = true;
                        }
    }
private TreeViewItem GetTreeViewItem(Model node)
    {
// a recursive method for going to root of the tree and coming back

        if (node.Parent == null)
        {
            DependencyObject dObject = treeView.ItemContainerGenerator.ContainerFromItem(node);
            return (TreeViewItem)dObject;
        }
        TreeViewItem parentItem = GetTreeViewItem(node.Parent);
        if (parentItem == null)
            return null;
        DependencyObject Dependency = parentItem.ItemContainerGenerator.ContainerFromItem(node);
        return (TreeViewItem)Dependency;

    }

我确定我必须更新或呈现树视图数据源,但我不知道如何。

4

1 回答 1

1

您需要在视图模型中定义 IsSelected 属性,并在设置属性时调用 OnPropertyChanged。要将 IsSelected 链接到您的 TreeViewItem,请定义一个 ItemContainerStyle,例如在您的资源中或直接在您的 TreeView 中。

  <TreeView.ItemContainerStyle>
    <Style TargetType="{x:Type TreeViewItem}">
      <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}" />
      <Style.Triggers>
        <Trigger Property="IsSelected" Value="True">
          <Setter Property="FontWeight" Value="Bold" />
        </Trigger>
      </Style.Triggers>
    </Style>
  </TreeView.ItemContainerStyle>

完成后,只需设置_model.IsSelected = true

于 2013-06-11T18:59:33.230 回答