Представленные здесь ответы только преобразуют массив в XML с узлами, вы не можете устанавливать атрибуты. Я написал функцию php, которая позволяет преобразовать массив в php, а также установить атрибуты для определенных узлов в xml. Недостатком здесь является то, что вы должны сконструировать массив определенным образом с несколькими соглашениями (только если вы хотите использовать атрибуты)
В следующем примере вы также можете установить атрибуты в XML.
Подробный пример и использование можно найти здесь: http://www.lalit.org/lab/convert-php-array-to-xml-with-attributes/
array(
'type' => 'fiction'
),
'book' => array(
array(
'@attributes' => array(
'author' => 'George Orwell'
),
'title' => '1984'
),
array(
'@attributes' => array(
'author' => 'Isaac Asimov'
),
'title' => 'Foundation',
'price' => '$15.61'
),
array(
'@attributes' => array(
'author' => 'Robert A Heinlein'
),
'title' => 'Stranger in a Strange Land',
'price' => array(
'@attributes' => array(
'discount' => '10%'
),
'@value' => '$18.00'
)
)
)
);
/* creates
1984
Foundation
$15.61
Stranger in a Strange Land
$18.00
*/
?>
В своем xaml-файле вы привязываете SelectedItem к SelectColorList, который является коллекцией, чтобы исправить это, вы должны привязать одно значение (некоторое строковое свойство в вашем случае), а не коллекцию.
ОБНОВЛЕНИЕ:
& emsp; Прежде всего, я хочу упомянуть, что нет способа для множественного связывания, поэтому мы будем использовать событие SelectionChanged.
& emsp; Например, это ваш вид, который содержит два списка, один из которых будет содержать источник цветов, который будет иметь возможность выбора нескольких элементов:
<Window x:Class="WpfApp1.MainWindow">
<StackPanel Orientation="Horizontal">
<!-- First list box contains colors -->
<ListBox
ItemsSource="{Binding ColorList}"
SelectionMode="Extended"
SelectionChanged="ListBox_SelectionChanged"
/>
<!-- Second list box will contain result values -->
<ListBox
ItemsSource="{Binding ItemList}"
/>
</StackPanel>
</Window>
[116 ]
& emsp; Ваш MainWindow.xaml.cs:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
// Set data context
DataContext = new ViewModel();
}
/// <summary>
/// Called when selection is changed
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ListBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
// Get event sender
var listBox = sender as ListBox;
// Create temp list for selected items
var tempList = new List<string>();
foreach (string item in listBox.SelectedItems)
{
tempList.Add(item);
}
(DataContext as ViewModel).OnSelectionChanged(tempList);
}
}
& emsp; И, наконец, модель вашего представления:
public class ViewModel : INotifyPropertyChanged
{
#region Private Fields
private ObservableCollection<string> mColorList;
private ObservableCollection<string> mItemList;
#endregion
#region Public Properties
/// <summary>
/// This is list box 1 items source with colors
/// </summary>
public ObservableCollection<string> ColorList
{
get { return mColorList; }
set
{
mColorList = value;
NotifyPropertyChanged(nameof(ColorList));
}
}
/// <summary>
/// This is list box 2 items with results
/// </summary>
public ObservableCollection<string> ItemList
{
get { return mItemList; }
set
{
mItemList = value;
NotifyPropertyChanged(nameof(ItemList));
}
}
#endregion
#region Constructor
public ViewModel()
{
// Initialization
ColorList = new ObservableCollection<string>() { "red", "blue", "yellow", "green" };
ItemList = new ObservableCollection<string>() { "not selected!" };
}
#endregion
#region Public Methods
/// <summary>
/// Called when selection is changed
/// </summary>
/// <param name="selectedItems"></param>
public void OnSelectionChanged(IEnumerable<string> selectedItems)
{
ItemList.Clear();
foreach (var item in selectedItems)
{
switch (item)
{
case "red":
ItemList.Add("apple");
ItemList.Add("sun");
break;
case "blue":
ItemList.Add("sea");
ItemList.Add("sky");
break;
}
}
}
#endregion
#region InterfaceImplementation
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
[ 1113]
В Xaml вам необходимо привязать свойство SelectedItem к строке (не списку / коллекции)
<ListBox SelectedItem="{Binding SelectColor}" ItemsSource="{Binding ColorList}"/>
<ListBox ItemsSource="{Binding ItemList}"/>
ViewModel,
private string _selectedColor;
public string SelectedColor
{
get => _selectedColor;
set
{
_selectedColor = value;
ItemList.Clear();
switch (_selectedColor)
{
case "red":
ItemList.Add("apple");
ItemList.Add("sun");
break;
…
}
NotifyPropertyChanged(nameof(SelectedColor));
}
Также я бы предложил использовать [112 ] вместо ItemListVal
(вспомогательное поле) при добавлении / удалении элементов из коллекции.