0

ユーザーがサブアイテムを動的に作成できるようにするWPFアプリケーションがありますtreeview。これらのサブ項目は、別のウィンドウから作成され、メイン ウィンドウに追加されます。別のウィンドウからメイン ウィンドウのサブアイテムを削除する delete メソッドも実装したいと思います。

これらはいくつかのコードと一緒に私の考えです:

//Okay button -- Delete sub-items in main window TreeView
private void button2_Click(object sender, RoutedEventArgs e)
{
    //Query for Window1
    var mainWindow = Application.Current.Windows
        .Cast<Window1>()
        .FirstOrDefault(window => window is Window1) as Window1;

    //Name of header that needs to be located
    string header = textBox1.Text;

    //While treeview from main window contains subitems
    while (!mainWindow.treeView.Items.IsEmpty)
    {
        //Find TreeView subitem with matching header
        //? - not sure on code

        //Delete TreeView subitem
        //I'm guessing it has something to do with
        //mainWindow.treeView.Items.Remove(At?)....
    }
}

私のコメントは、私が確信していないことを示しています。mainWindow を正しくクエリし、検索するヘッダーの文字列値を設定しました。を検索するループを設定しましたtreeviewが、ジョブを完了するための正確なコードがわかりません。私が使用すべきコードを教えてください。

回答に基づいて修正されたコード

私はあなたの答えを理解するために最善を尽くしています。コメントで何をしようとしているのかを説明しました。私は正しい軌道に乗っていると思いますが、使用しようとすると小さなコンパイラ エラーが発生しますRemoveAll。ある種の a を含める必要がありますusing resourceDictionaryか?

コードの改訂

私に固執してくれてありがとう。コンパイラは、 への呼び出しに対してまだエラーを出していますRemoveAll

//Okay button -- Delete location and corrusponding block
    private void button2_Click(object sender, RoutedEventArgs e)
    {
        //Close Delete Window
        this.Close();

        //Query for Window1
        var mainWindow = Application.Current.Windows
            .Cast<Window1>()
            .FirstOrDefault(window => window is Window1) as Window1;

        //Name of header that needs to be located
        string header = textBox1.Text;

        //Treeview under operation from main window
        TreeViewItem items = mainWindow.treeViewItem;

        //Delete corresponding node
        RemoveAll(items, p => string.Equals(p.Header, header));
    }

    //REMOVE ALL METHOD - for use with button_click ^
    public void RemoveAll(ItemCollection items, Predicate<TreeViewItem> isValid)
    {
        for (int i = items.Count - 1; i >= 0; i--)
        {
            TreeViewItem vItem = (TreeViewItem)items[i];
            if (isValid(vItem))
            {
                items.RemoveAt(i);
            }
            else
            {
                RemoveAll(vItem.Items, isValid);
            }
        }
    }

ビルドエラー

エラー 1: '...(プロジェクト)...' に最適なオーバーロードされたメソッドに無効な引数が含まれています。

エラー 2: 引数 '1':System.Windows.Controls.TreeViewitemから `System.Windows.Controls.ItemCollection' に変換できません。

ありがとうございました。

4

1 に答える 1

0
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        string header = txtRemove.Text; //name of Treeviewitem to delete
        TreeView view = trvView; //get from location

        RemoveAll(view.Items, p => string.Equals(p.Header, header));
    }

    public bool Remove(ItemCollection items, Predicate<TreeViewItem> isValid)
    {
        for (int i = items.Count - 1; i >= 0; i--)
        {
            TreeViewItem vItem = (TreeViewItem)items[i];
            if (isValid(vItem))
            {
                items.RemoveAt(i);
                return true;
            }
            else
            {
                bool isDeleted = Remove(vItem.Items, isValid);
                if (isDeleted)
                    return isDeleted;
            }
        }
        return false;
    }

    public void RemoveAll(ItemCollection items, Predicate<TreeViewItem> isValid)
    {
        for (int i = items.Count - 1; i >= 0; i--)
        {
            TreeViewItem vItem = (TreeViewItem)items[i];
            if (isValid(vItem))
            {
                items.RemoveAt(i);
            }
            else
            {
                RemoveAll(vItem.Items, isValid);
            }
        }
    }

}

///Xaml

<Window x:Class="TreeViewSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TreeView x:Name="trvView" HorizontalAlignment="Left" Height="215" Margin="68,35,0,0" VerticalAlignment="Top" Width="221">
            <TreeView.Items>
                <TreeViewItem Header="1">
                    <TreeViewItem Header="1/1"/>
                    <TreeViewItem Header="1/2"/>
                    <TreeViewItem Header="1/3"/>
                </TreeViewItem>
                <TreeViewItem Header="2">
                    <TreeViewItem Header="2/1"/>
                    <TreeViewItem Header="2/2"/>
                    <TreeViewItem Header="2/3"/>
                </TreeViewItem>
                <TreeViewItem Header="3">
                    <TreeViewItem Header="3/1"/>
                    <TreeViewItem Header="3/2"/>
                    <TreeViewItem Header="3/3"/>
                </TreeViewItem>
            </TreeView.Items>

        </TreeView>
        <Button  Content="Button" HorizontalAlignment="Left" Margin="333,155,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/>
        <TextBox x:Name="txtRemove" HorizontalAlignment="Left" Height="23" Margin="333,102,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>

    </Grid>
</Window>
于 2013-07-26T13:20:47.367 に答える