2009-03-23 17 views
1

私はこの回答をmy previous questionに送ろうと思っていましたが、それは役に立ちませんでした。初期の状況はほとんど同じです:wpf-treeviewで親項目を見つける

<TreeView ItemsSource="{Binding Groups}" Name="tvGroups" AllowDrop="True"> 
      <TreeView.ItemTemplate> 
        <HierarchicalDataTemplate ItemsSource="{Binding Participants}"> 
          <StackPanel Orientation="Horizontal" Drop="tvDrop" Tag="{Binding .}"> 
           <TextBlock Text="{Binding Name}" /> 
           <Button Tag="{Binding .}" Click="Button_Click_2"> 
            <Image Source="Resources/cross.png" /> 
           </Button> 
          </StackPanel> 
          <HierarchicalDataTemplate.ItemTemplate> 
           <DataTemplate> 
            <StackPanel Orientation="Horizontal" > 
             <TextBlock Text="{Binding Alias}" /> 
             <Button Tag="{Binding .}" Name="btnDeleteParticipants" Click="btnParticipants_Click" > 
              <Image Source="Resources/cross.png" /> 
             </Button> 
            </StackPanel> 
           </DataTemplate> 
          </HierarchicalDataTemplate.ItemTemplate> 
        </HierarchicalDataTemplate> 
      </TreeView.ItemTemplate> 
</TreeView> 

private void btnParticipants_Click(object sender, RoutedEventArgs e)//Probanten aus Gruppe entfernen 
     { 
      Participant p = ((sender as Button).Tag as Participant); 
      if (p == null) return; 
      //TODO: Raus bekommen in welcher Gruppe ich löschen will 

     } 

私はボタン(btnDeleteParticipants)をクリックしてGroupからParticipant pを削除したいです。 (私はよく分からない理由を、聞かないでください)

Control c = sender as Control; 
while (!(c is TreeViewItem)) 
    c = (c.Parent) as Control; 

しかし、これは動作しませんでした:私はこの1つのようなものを試してみました。 Groupは、ParticipantbtnDeleteParticipants.Tagにバインドされています)が含まれているかどうかを調べることで確認できますが、参加者は複数のグループに属しません。 だから、どのように正しい方法を得るためにどのようなアイデアGroup

編集:

Groups = new ObservableCollection<Group>(); 
Participants = new ObservableCollection<Participant>(); 
+0

にあなたは面白いジョシュ・スミスによって[この記事](http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx)かもしれません。 – mostlytech

答えて

1

グループと参加者のObservableCollectionオブジェクトはありますか?

は、これを使用してみてください:

static TObject FindVisualParent<TObject>(UIElement child) where TObject : UIElement 
{ 
    if (child == null) 
    { 
    return null; 
    } 

    UIElement parent = VisualTreeHelper.GetParent(child) as UIElement; 

    while (parent != null) 
    { 
    TObject found = parent as TObject; 
    if (found != null) 
    { 
     return found; 
    } 
    else 
    { 
     parent = VisualTreeHelper.GetParent(parent) as UIElement; 
    } 
    } 

    return null; 
} 

また、参加者を取得し、TemplatedParentにタグを設定するのDataContextを使用してみてください。

<Button Tag="{Binding RelativeSource={RelativeSource TemplatedParent}}" /> 

クリック

private void btnParticipants_Click(object sender, RoutedEventArgs e) 
{ 
    var button = sender as Button; 
    var p = button.DataContext as Participant; 
    if (p == null) return; 

    var t= FindVisualParent<TreeViewItem>(button); // get the Participants TreeViewItem 
    if (t == null) return; 
    var groupTreeItem = FindVisualParent<TreeViewItem>(t); // get the groups TreeViewItem 
    if (groupTreeItem == null) return; 
    var group = groupTreeItem.DataContext as Group; 
    group.Participants.Remove(p); 
} 
+0

sry、私はこの方法を使用する方法が表示されません。 ParamterType(** this ** TreeViewItem item)の前に 'this'と何がありますか?私はパラメータとして使用するTreeViewItemを持っていません。 –

+0

これは、いわゆる拡張メソッドです。 TVIで宣言されたメソッドであるかのようにTReeViewItemで呼び出すことができます。 – Joey

+0

XAMLが機能しません。私はパスを追加する必要があります(そして、このasp名前空間は何ですか?) –

関連する問題