C # WPF ListView не удаляет элементы должным образом - PullRequest
0 голосов
/ 25 октября 2018

У меня есть ListView, который выглядит следующим образом;

<Window x:Class="WPF_Viewer.URLLinks"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WPF_Viewer"
    mc:Ignorable="d"
    Title="URLLinks" Height="461.215" Width="606.542" WindowStartupLocation="CenterScreen">
<Grid>
    <ListView x:Name="proxyListView" Loaded="proxyListView_Loaded">
        <ListView.ContextMenu>
            <ContextMenu Name="contextMenu1">
                <MenuItem Name="item1" Header="Delete" Click="item1_Click"/>
            </ContextMenu>
        </ListView.ContextMenu>
    </ListView>
</Grid>
</Window>

Я пытаюсь добавить ContextMenu для удаления SelectedItem Это код позади;

public partial class URLLinks : Window
{
    public URLLinks()
    {
        InitializeComponent();
    }

    private void proxyListView_Loaded(object sender, RoutedEventArgs e)
    {
        proxyListView.ItemsSource = GlobalVars.URLLinks;
    }

    private void item1_Click(object sender, RoutedEventArgs e)
    {
        GlobalVars.URLLinks.RemoveAt(proxyListView.SelectedIndex);
        ICollectionView view = CollectionViewSource.GetDefaultView(proxyListView.ItemsSource);
        //view.Refresh();
    }
}

Есть идеи?

РЕДАКТИРОВАТЬ: это переменная и как она установлена ​​

public static async void GetLink(string url)
    {
        try
        {
            string sURL = url;
            Uri uri = new Uri(sURL);
            string host = uri.Host;
            using (HttpClient clientduplicate = new HttpClient())
            {
                clientduplicate.DefaultRequestHeaders.Add("User-Agent",
                    "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident / 6.0)");
                using (HttpResponseMessage responseduplicate = await clientduplicate.GetAsync(sURL))
                {
                    using (HttpContent contentduplicate = responseduplicate.Content)
                    {
                        try
                        {
                            string resultduplicate = await contentduplicate.ReadAsStringAsync();
                            var websiteduplicate = new HtmlAgilityPack.HtmlDocument();
                            websiteduplicate.LoadHtml(resultduplicate);
                            List<string> ListItems = new List<string>();
                            Settings.Default.Reload();
                            int maxLinks = Convert.ToInt32(Math.Round(Convert.ToDouble(Settings.Default["subLinksValue"]) * 10));

                            foreach (HtmlNode links in websiteduplicate.DocumentNode.SelectNodes("//a[@href]"))
                            {
                                HtmlAttribute att = links.Attributes["href"];
                                foreach (var link in att.Value.Split(' '))
                                {
                                    if (ListItems.Count >= maxLinks)
                                    {
                                        GlobalVars.URLLinks = ListItems;
                                        //File.WriteAllLines(AppDomain.CurrentDomain.BaseDirectory + @"\links.txt", ListItems.ToArray());
                                        return;
                                    }
                                    if (link.StartsWith("http") && link.Contains(host) && CheckURLValid(link))
                                    {
                                        ListItems.Add(link);
                                    }
                                }
                            }
                            GlobalVars.URLLinks = ListItems;
                            //File.WriteAllLines(AppDomain.CurrentDomain.BaseDirectory + @"\links.txt", ListItems.ToArray());
                            //return ListItems;
                        }
                        catch (Exception ex1)
                        {
                            Console.WriteLine("Error getting links");
                            //return null;
                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            System.Windows.MessageBox.Show("Error, url not formatted correctly. Try coping your url from your browser");
        }
    }

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Если GlobalVars.URLLinks возвращает ObservableCollection<T> или любой другой пользовательский тип, который реализует интерфейс INotifyCollectionChanged, это будет работать:

private void item1_Click(object sender, RoutedEventArgs e)
{
    var ic = proxyListView.ItemsSource as IList<string>;
    ic.RemoveAt(proxyListView.SelectedIndex);
}

Но если исходная коллекция не вызывает уведомления об изменениях, когдаэлементы удалены (a List<T> нет), вам придется заново установить свойство ItemsSource после удаления элемента, чтобы обновить ListView:

private void item1_Click(object sender, RoutedEventArgs e)
{
    GlobalVars.URLLinks.RemoveAt(proxyListView.SelectedIndex);
    proxyListView.ItemsSource = GlobalVars.URLLinks;
}
0 голосов
/ 25 октября 2018

Единственное, что мне нужно было сделать, чтобы заставить это работать, - изменить вашу коллекцию с List<string> на ObservableCollection<string>.

После того, как вы это сделаете, вам не нужно сбрасывать элементыв представлении списка.

static ObservableCollection<string> items = new ObservableCollection<string>() { "Item 1", "Item 2" };

private void proxyListView_Loaded(object sender, RoutedEventArgs e)
{
    proxyListView.ItemsSource = items;
}

private void item1_Click(object sender, RoutedEventArgs e)
{
    items.RemoveAt(proxyListView.SelectedIndex);
} 
0 голосов
/ 25 октября 2018

Даже если вы не собираетесь идти по полному маршруту MVVM, по крайней мере, используйте ObservableCollection элементов и присвойте этому свой ItemSource ListView.Это автоматически обновит элемент управления при удалении или добавлении элемента.

Попытка выполнения операций бизнес-логики для элемента управления пользовательского интерфейса вскоре выродится в большой шар спагетти.

...