Добавить элементы в поле со списком как флажок - PullRequest
0 голосов
/ 04 августа 2020

Здравствуйте, я использую XAML / WPF для создания Combobox, а затем использую XML для его заполнения

Используя предложение ниже, это мой обновленный код, и теперь он работает !!

Это мой XAML с использованием предложений, приведенных ниже

    <ComboBox x:Name="customer_comboBox" HorizontalAlignment="Left" Margin="83,259,0,0" VerticalAlignment="Top" Width="172" SelectionChanged="customer_comboBox_SelectionChanged" >
         <ComboBox.ItemTemplate>
             <DataTemplate>
                    <CheckBox Content="{Binding}"/>
            </DataTemplate>
         </ComboBox.ItemTemplate>
    </ComboBox>

Это мой XML

<?xml version="1.0" encoding="utf-8" ?>
<ComboBox>
  <Customer name="John">
    <Data>
      <System>Linux</System>
    </Data>
  </Customer>
  <Customer name="Fernando">
    <Data>
      <System>Microsoft</System>
      <System>Mac</System>
    </Data>
  </Customer>
</ComboBox>

И это код, который используется для заполнения customer_comboBox

 XmlDocument doc = new XmlDocument();
 doc.Load(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) +@"\comboBox.xml");
 XmlNodeList customerList = doc.SelectNodes("ComboBox/Customer");
 List<string> customers = new List<string>();

 foreach (XmlNode node in customerList)
 {
     customers.Add(child.InnerText);
 }
 customer_comboBox.ItemsSource = customers;

Все это работает, но я хотел бы, чтобы добавленные элементы внутри Combobox были в форме контрольного списка. Я сделал это через XAML, добавив элементы Checkbox вручную, но поскольку я заполняю поле со списком автоматически, читая XML Мне нравится делать это с помощью кода. Я предполагаю, что мне нужно сделать какой-то тип привязки данных, но я не знаю, как, и ответы, которые я видел здесь, имеют возраст несколько лет, которые ссылаются на DataSource, который больше не является атрибутом Combobox

Ответы [ 2 ]

1 голос
/ 04 августа 2020

Самый простой способ: в XAML

<ComboBox x:Name="customer_comboBox" ...all other themings...>
  <ComboBox.ItemTemplate>
    <DataTemplate>
      <CheckBox Content="{Binding Name}"/>
    </DataTemplate>
  </ComboBox.ItemTemplate>
</ComboBox>

Для простоты создан класс модели данных с именем Customer

public class Customer
{
  public string Name {get;set;}
}

Тогда ваш метод будет похож на

XmlDocument doc = new XmlDocument();
 doc.Load(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) +@"\comboBox.xml");
 XmlNodeList customerList = doc.SelectNodes("ComboBox/Customer");

List<Customer> customers = new List<Customer>()

 foreach (XmlNode node in customerList)
 {
   customers.Add(new Customer(){ Name = node.Attributes["name"].InnerText });
 }

customer_comboBox.ItemsSource = customers;
0 голосов
/ 04 августа 2020

Сначала создайте бизнес-класс:

public class Customer: INotifyPropertyChanged
{
    // INotifyPropertyChanged implementation
    public virtual event PropertyChangedEventHandler PropertyChanged;
    public virtual void NotifyPropertyChanged(string propName)
        => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
    
    public string Name { get; set; }

    // Property to build to IsChecked of CheckBox
    public bool IsSelected { get; set; }
}

Затем флажок будет выглядеть так (вы можете привязать его позже; хотя, если вы хотите динамически добавлять / удалять элементы из ComboBox во время во время выполнения, мой совет - использовать что-то другое, кроме IList, в качестве привязки к данным ItemsSource, например некоторую реализацию ObservableCollection)

    <ComboBox Name="cbx">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <CheckBox IsChecked="{Binding IsSelected}"
                       Width="20" />
                    <TextBlock Text="{Binding Name}"
                       Width="100" />
                </StackPanel>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

Вот как вы заполняете ComboBox данными:

        List<Customer> customers = new List<Customer>();
        // populate list instead of ComboBox from xml data source here...

        // then set the list as source
        cbx.ItemsSource = customers;

Позже, чтобы получить выбранные предметы:

 List<Customer> selectedCustomers = ((List<Customer>)cbx.ItemsSource)
     .Where(a => a.IsSelected).ToList();
...