2017-08-15 158 views
0

ユーザーがデータベースを検索するためにクエリを編集できるWPF UIを作成しようとしています。クエリーはコンボボックスLike Thisから消費者が選択したものに基づいて作成され、新しい条件を追加する場合はボタンをクリックする限り、必要なだけ多くのフィルタを作成できます。WPF - StackPanelから "User Control"子を削除する

私はこのようなユーザーコントロールとコンボボックスのテンプレートを作成しました:

ユーザーコントロールのXAML:

<StackPanel Orientation="Horizontal" > 
     <Button 
       Name="DeleteFilter" 
       HorizontalAlignment="Left" 
       Margin="5" 
       Content="-" 
      Click="DeleteFilter_OnClick"> 
     </Button> 
     <ComboBox 
       Text="Property" 
       x:Name="Property" 
       Width="100" 
       DataContext="{StaticResource SomeViewModel}" 
       ItemsSource="{Binding Properties}" 
       DisplayMemberPath="Name" 
      SelectionChanged="Property_OnSelectionChanged"/> 
     <ComboBox 
      Text="PropertyOperator" 
      x:Name="Operator" 
      ItemsSource="{Binding Operators}" 
      DisplayMemberPath="Name" 
      SelectionChanged="Operator_OnSelectionChanged"> 
     </ComboBox> 
     <TextBox 
       x:Name="Value" 
       Text="Value" 
       TextAlignment="Center" 
       Width="100" 
       Margin="5"/> 
</StackPanel> 

ユーザーがが新しい条件追加]ボタンをクリックするたびに、私はこのイベントを呼び出します。

private void AddFilterButton_OnClick(object sender, RoutedEventArgs e) 
    { 
     var conditionUserControl = new ConditionUserControl(); 
     StackPanel.Children.Add(conditionUserControl); 
    } 

すべて正常に動作します。

私の質問:

どのように私はDeleteFilterbutton that exists in the User Control templateをクリックしてから、ユーザーコントロールの子を削除することができます。

StackPanel.Children.Remove(..); 

が私のメインウィンドウから子供を削除するが、どのようにユーザーがクリックした子を知っている:

は、私はこれを試してみました。

+0

はどのように:

私はこれをしなかったと機能が動作

ボタンは削除する子を知っていますか? 'StackPanel'は' SelectedItem'を提供しません。あなたが何らかの方法で各子供にボタンを追加したり、選択を処理したりしない限り...あなたは単に最後のものを削除したいですか(https://stackoverflow.com/q/28208686/1997232)? – Sinatr

+0

いいえ、ユーザーがクリックした子を削除したいのですが、それは可能ですか?それがポイントです。私はWPFには新しく、私は知りませんこれを可能にする方法...あなたは創造された子供のそれぞれにボタンを追加するという良いアイデアはあると思いますか? –

+0

* "作成した各子供にボタンを追加する" * - それはまったく問題ありません。私はあなたがすでにそれをしていることに気付かなかった。ビジュアルツリーにボタンを含むユーザコントロールを見つけ、そのインスタンスを 'StackPanel'から削除することができます。 – Sinatr

答えて

1

これを試してみてください:

private void DeleteFilter_OnClick(object sender, RoutedEventArgs e) 
{ 
    Button btn = sender as Button; 
    var conditionUserControl = FindParent<ConditionUserControl>(btn); 
    if (conditionUserControl != null) 
    { 
     var sp = FindParent<StackPanel>(conditionUserControl); 
     if (sp != null) 
      sp.Children.Remove(conditionUserControl); 
    } 
} 


private static T FindParent<T>(DependencyObject dependencyObject) where T : DependencyObject 
{ 
    var parent = VisualTreeHelper.GetParent(dependencyObject); 

    if (parent == null) return null; 

    var parentT = parent as T; 
    return parentT ?? FindParent<T>(parent); 
} 
+0

私は答えを理解するために縫い合わせることはできません。 AddFilterButtonはスタックパネルに子を追加することになっています。あなたが提案していることを実装すると、この機能が削除されます。私はWPFの新機能です。 –

+0

申し訳ありませんが、これはDeleteFilter_OnClickイベントハンドラの実装です。私は名前を変更しました。 – mm8

+0

私は理解しています。 AddFilterはFilterWindowクラスのボタンで、DeleteFilterボタンはConditionUserControlという別のクラスにあります。したがって、StackPanelは認識されません。 –

0

の@ MM8の解答へのもう一つの答えは次のとおりです。

更新AddFilterButton_OnClick:

private void AddAndFilterButton_OnClick(object sender, RoutedEventArgs e) 
    { 
     var conditionUserControl = new ConditionUserControl(); 

     StackPanel.Children.Add(conditionUserControl); 

     conditionUserControl.DeleteFilter.Click += (o, args) => StackPanel.Children.Remove(conditionUserControl); 
    } 
関連する問題