Я хочу использовать SelectionChangeEvent ListBox в MVVM

Представленные здесь ответы только преобразуют массив в 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
  

*/
?>

1
задан Presto 18 January 2019 в 10:01
поделиться

2 ответа

В своем 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]
Вот как это можно сделать. Надеюсь, этот ответ поможет вам

0
ответ дан Polly 18 January 2019 в 10:01
поделиться

В 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 (вспомогательное поле) при добавлении / удалении элементов из коллекции.

0
ответ дан fhnaseer 18 January 2019 в 10:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: