2013-09-23 4 views
0

편집 가능한 노드가있는 TreeView를 만들고 싶습니다. 나는이 생각 나는 글이 좋은 봤 :MVVM에서 선택된 TreeViewItem 가져 오기

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

그러나 나는 문제가있다. 내 TreeView는 dinamically 형성, arcticle에서 정적으로되지 않습니다. DocPackageExtended 목록 - 그

<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처럼.

첫 번째 질문 - 어떻게하면 TestCommand에서 TreeViewItem 인스턴스를 얻을 수 있습니까? 인스턴스가 아닙니다 DocPackageExtended 클래스! 선택한 인스턴스를 얻으려면 TreeViewItem 기사 에서처럼.

그리고 두 번째 질문

- 나는 예를 TreeViewItem를 얻을 후에는 어떻게 트 리뷰 항목의 DataTemplate을에서 EditableTextBlock를 얻을 수 있습니다.

추가 된 대답은

나는 이미 그것을 시도. MVVM 뷰 모델의 원인은 링크, 그

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 유형에 내가 XAML의 변화보다 재산

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

을 정의합니다.

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

너무 :( 어떤 아이디어를 작동하지 않습니다

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

뷰 모델

에서?

답변

0

첫 번째 질문 : 다중 선택이 비활성화되어

IEnumerable<DocPackageExtended> selectedEntries = PackageExtendedList.Where(d => d.IsSelected); 

경우에 트 리뷰의 선택된 항목을 바인딩 할 수 있습니다 : 당신이 여러 항목을 선택할 수 있다는 것 때문에, 당신은 TestCommand의 실행 방법에있는 모든 선택 항목을 필터링 할 필요가 귀하의 VM에 속성 및 TestCommand의 메서드 에서이 속성에 액세스 할 수 있습니다.

두 번째 질문 : 데이터 항목의 컨테이너는 var container = YourTreeViewInstance.ItemContainerGenerator.ContainerFromItem(dataInstance);입니다. 이제 EditableTextBlock 컨트롤을 찾을 때까지 VisualTreeHelper의 도움으로이 컨테이너를 통과해야합니다. 하지만 ViewModel에서는 헬퍼 클래스 나 첨부 된 속성을 사용하여이 작업을 수행하지 않습니다.

편집 : 당신은 그러나 당신이 TestCommandMethod 당신이 직접 DocPackageExtended 인스턴스의 IsEditable 속성을 조작하고, 귀하의 EditableTextBox로 DocPackageExtended 클래스의 Childs 속성에 인스턴스의 IsEditable 속성을 결합하고 있습니다. 다음 작업을 수행 할 수 있습니다.

private void TestCommandMethod(object obj) 
{ 
    var dpe = obj as DocPackageExtended; 
    if (dpe == null) 
     return; 
    dpe.IsEditable = true; 
    foreach (RootDocPackage rdp in dpe.Childs) 
    { 
     rdp.IsEditable = true; 
    } 
} 
+0

첫 번째 게시물에 대한 답변을 추가하여 형식 코드로 볼 수 있습니다. 텍스트에서 회색 배경을 만드는 방법은 무엇입니까? 찾을 수 없습니다. – monstr

+0

TestCommand의 CommandParameter가'ViewModel' 자체이고'DocPackageExtended' 인스턴스가 아니라고 가정하므로 대화는 항상 null을 반환합니다. 그게 사실이라면 제 편집을보세요. –

+0

CommandParameter에 디버거에서 올바른 형식의 개체 (DocPackageExtended)가 선택되어 있습니다. 다중 선택이 허용되지 않습니다. – monstr

0

이 정보는 도움이 될 수 있습니다.

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     TreeViewItem treeViewItemFound = GetItem(MyTreeview, MyTreeview.SelectedItem); 
     ContentPresenter header = treeViewItemFound.Template.FindName("PART_Header", treeViewItemFound) as ContentPresenter; 
     if (header != null) 
     { 
      TextBox myTextBox = (TextBox)header.ContentTemplate.FindName("MyTextBox", header); 
     } 
    } 

    public TreeViewItem GetItem(ItemsControl container, object itemToSelect) 
    { 
     foreach (object item in container.Items) 
     { 
      if (item == itemToSelect) 
      { 
       return (TreeViewItem)container.ItemContainerGenerator.ContainerFromItem(item); 
      } 
      else 
      { 
       ItemsControl itemContainer = (ItemsControl)container.ItemContainerGenerator.ContainerFromItem(item); 
       if (itemContainer.Items.Count > 0) 
       { 
        TreeViewItem treeViewItemFound = GetItem(itemContainer, itemToSelect); 
        if (treeViewItemFound != null) 
         return treeViewItemFound; 
       } 
      } 
     } 

     return null; 
    } 
관련 문제