Добавьте только один элемент XML в поле со списком - PullRequest
0 голосов
/ 08 мая 2020

Я делаю небольшое приложение с некоторыми флажками и параметрами фильтрации в Visual Studio WPF, используя c#.

Для моих данных у меня есть документ XML с различными местоположениями, который выглядит следующим образом:

<Cities>
    <Location>
        <Name>Gava</Name>
        <City>Barcelona</City>
        <Community>Catalonia</Community>
        <Checked>False</Checked>
      </Location>
      <Location>
        <Name>Castelldefels</Name>
        <City>Barcelona</City>
        <Community>Catalonia</Community>
        <Checked>False</Checked>
      </Location>
      <Location>
        <Name>San Juan</Name>
        <City>Alicante</City>
        <Community>Valencia</Community>
        <Checked>False</Checked>
      </Location>
      <Location>
        <Name>Benidorm</Name>
        <City>Alicante</City>
        <Community>Valencia</Community>
        <Checked>False</Checked>
      </Location>
      <Location>
        <Name>Sagunto</Name>
        <City>Valencia</City>
        <Community>Valencia</Community>
        <Checked>False</Checked>
      </Location>
</Cities>

С помощью этого я заполняю список флажками с помощью этой функции:

XDocument xdoc = XDocument.Load("Data.xml");

private void PopulateLocationList()
        {
            foreach(var elem in xdoc.Descendants("Location"))
            {
                ListView1.Items.Add(new CheckBox { Content = elem.Element("Name").Value, IsChecked = Convert.ToBoolean(elem.Element("Checked").Value) });
            }
        }

Что я хочу сделать сейчас, это заполнить ComboBox с помощью City имена, но значение города появляется только один раз. Я попробовал ту же функцию выше, изменив некоторые имена, например:

foreach(var elem in xdoc.Descendants("Location"))
            {
                ComboBox1.Items.Add(new ComboBoxItem { Content = elem.Element("City").Value });
            }

, но при этом получаются все значения City и заполняются ComboBox. Я хочу, чтобы повторяющееся значение (например, два Барселоны) отображало только одно в ComboBox. Я просто не могу придумать, как это сделать.

Заранее спасибо всем, кто отвечает. Я все еще новичок во всем этом программировании и не получаю формального обучения, просто следую руководствам по inte rnet, и иногда это становится сложно, вот так.

Edit : I Я знаю, что могу сделать это вручную в конструкторе или даже использовать отдельную часть в моем документе xml только для городов, но я хочу сделать это так, чтобы можно было повторно использовать некоторые элементы i, такие как Listview и Comboboxes

1 Ответ

1 голос
/ 08 мая 2020

Я поместил отдельный элемент внутри foreach для удобства чтения .. но он может быть в конце оператора xdoc после Select .

var cities = xdoc.Descendants("Location").Select(o => o.Element("City").Value);

foreach (var city in cities.Distinct())
{
    ComboBox1.Items.Add(new ComboBoxItem { Content = city });
}

// o => o.Elements - это то же самое, что и следующие

void MainMethod()
{
    var cities = xdoc.Descendants("Location").Select(SelectCity);

    foreach (var city in cities.Distinct())
    {
        ComboBox1.Items.Add(new ComboBoxItem { Content = city });
    }
}

string SelectCity(XElement location)
{
    return location.Element("City").Value;
}

Посмотрите на операторы linq (может быть довольно сложно). Хорошая маленькая страница шпаргалки: https://linqsamples.com/

Думайте о выборе как о foreach, который просто возвращает элемент. O => означает, что вы говорите то же самое, что и "var city in cities" после того, как лямбда-символ '=>' - это именно то, что вы хотите вернуть. (На самом деле это не то, что он делает, но в этом примере будет легче понять).

...