0

編集可能なノードで TreeView を作成したい。私が思うに、私はこの良い記事をグーグルで検索しました:

http://www.codeproject.com/Articles/31592/Editable-TextBlock-in-WPF-for-In-place-Editing

しかし、私には問題があります。私の TreeView は、アークティクルのように静的ではなく、動的に形成されました。そのように

    <TreeView Name="_packageTreeView" Margin="5" ItemsSource="{Binding PackageExtendedList}">
         <TreeView.InputBindings>
             <KeyBinding Key="C" Command="{Binding *TestCommand*}" CommandParameter="{Binding}" />
         </TreeView.InputBindings>
         <i:Interaction.Triggers>
             <i:EventTrigger EventName="SelectedItemChanged">
                 <i:InvokeCommandAction Command="{Binding PackageTreeItemChangeCommand}" CommandParameter="{Binding ElementName=_packageTreeView, Path=SelectedItem}"/>
             </i:EventTrigger>
         </i:Interaction.Triggers>
         <TreeView.ItemContainerStyle>
             <Style TargetType="{x:Type TreeViewItem}">
                 <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}" />
             </Style>
         </TreeView.ItemContainerStyle>
         <TreeView.ItemTemplate>
             <HierarchicalDataTemplate DataType="{x:Type MasterBuisnessLogic:RootDocPackage}" ItemsSource="{Binding Path=Childs}">
                 <Grid>
                     <Grid.ColumnDefinitions>
                         <ColumnDefinition>
                         </ColumnDefinition>
                         <ColumnDefinition>
                         </ColumnDefinition>
                     </Grid.ColumnDefinitions>
                    <Image Source="/Resources/DocGroup.png"></Image>
                    <Etb:EditableTextBlock Margin="5,0,0,0" Grid.Column="1" Text="{Binding Path=Name}"></Etb:EditableTextBlock>
                 </Grid> 
             </HierarchicalDataTemplate>
         </TreeView.ItemTemplate>
     </TreeView>

PackageExtendedList - DocPackageExtended のリスト。

最初の質問 - TestCommand で TreeViewItem インスタンスを取得するにはどうすればよいですか? DocPackageExtendedクラスのインスタンスではありません! 記事のようにTreeViewItemを選択したインスタンスを取得したい。

そして 2 番目の質問 - インスタンスTreeViewItemを取得した後、TreeView アイテムの DataTemplate からEditableTextBlockを取得するにはどうすればよいですか。

追加された回答

私はすでにそれを試しました。MVVM ViewModel の原因は、TreeView のような View オブジェクトへのリンクを持たないため、コード ビハインドでハンドラーを作成します。

private void TreeViewItemSelected(object sender, RoutedEventArgs e)
{
    // Already have TreeViewItem instance without of ItemContainerGenerator help
    var tvi = e.OriginalSource as TreeViewItem;

    if (tvi == null)
        return;

    var etb = VisualTreeLib.VisualTreeLib.GetVisualChild<EditableTextBlock>(tvi);
    if (etb == null)
        return;

    // Do what I want
    etb.IsEditable = true;
}

残念ながら、これは何の影響もありません:(

私もそのアプローチを試みましたが、失敗しました。

DocPackageExtended タイプでプロパティを定義します

public bool IsEditable
{
    get { return _isEditable; }
    set
    {
        _isEditable = value;
        OnPropertyChanged(new PropertyChangedEventArgs("IsEditable"));
    }
}

XAML の変更より:

<Etb:EditableTextBlock Margin="5,0,0,0" Grid.Column="1" Text="{Binding Path=Name}" *IsEditable="{Binding Path=IsEditable}"*/>

そしてViewModelで

private void TestCommandMethod(object obj)
{
    var dpe = obj as DocPackageExtended;
    if (dpe == null)
       return;
    dpe.IsEditable = true;
}

うまくいきません:(何かアイデアはありますか?

4

2 に答える 2