Получить значение ListView

362
16 января 2017, 18:22

Добрый вечер, подскажите пожалуйста, есть ListView:

<ListView x:Name="professions" MouseDoubleClick="professions_MouseDoubleClick">
    <ListView.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                  <TextBlock x:Name="id" Text="{Binding Key}"/>
                  <TextBlock x:Name="val" Text="{Binding Value}"/>
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

и есть обработчик события:

private void professions_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        groupSostav.Items.Add("???");
    }

При двойном клике нужно чтобы вот этот (Text="{Binding Value}") value добавлялся в ListBox groupsostav, не получается его получить, что нужно подставить в (groupSostav.Items.Add("???");) вместо "???" ?

В ListBox записи добавлены из конструктора вот так :

Dictionary<int, string> col1 = new Dictionary<int, string>()
        {
            {1, "Значение 1"},
            {2, "Значение 2"},
            {3, "Значение 3"}
        };
        foreach (var profList in col1)
        {
            professions.Items.Add(new Item { Key = profList.Key, Value = profList.Value });
        }
    }
    public class Item
    {
        public int Key { get; set; }
        public string Value { get; set; }
    }
Answer 1

Если вы пытаетесь работать с байдингом, то вот вам пример на ваш случай, но без работы в MVVM, как это обычно принято.

XAML

<Canvas>
    <ListView ItemsSource="{Binding ItemsForListView}"
              SelectedItem="{Binding SelectedItemInListView}"
              Height="100" Canvas.Left="24" Canvas.Top="33" 
              Width="215" MouseDoubleClick="ListView_MouseDoubleClick">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="н/п"
                                Width="30"
                                DisplayMemberBinding="{Binding Key}"/>
                <GridViewColumn Header="Название"
                                Width="150"
                                DisplayMemberBinding="{Binding Value}"/>
            </GridView>
        </ListView.View>
    </ListView>
    <ListBox ItemsSource="{Binding ItemsForListBox}"
         Height="180" Canvas.Left="323" Canvas.Top="40" Width="125">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Key}" Margin="5" />
                    <TextBlock Text="{Binding Value}" Margin="5" />
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Canvas>

CodeBehind

public partial class MainWindow : Window, INotifyPropertyChanged
{
    /// <summary>
    /// Реализация INotifyPropertyChanged
    /// </summary>
    public event PropertyChangedEventHandler PropertyChanged = delegate { };
    /// <summary>
    /// Коллекция для ListView
    /// </summary>
    public ObservableCollection<Item> ItemsForListView { get; set; }
    /// <summary>
    /// Элемент выбранный в ListView
    /// </summary>
    private Item _SelectedItemInListView;
    public Item SelectedItemInListView
    {
        get { return _SelectedItemInListView; }
        set
        {
            _SelectedItemInListView = value;
            //сообщаем о том, что элемент изменился
            PropertyChanged(this, new PropertyChangedEventArgs(nameof(SelectedItemInListView)));
        }
    }
    /// <summary>
    /// Коллекция для ListBox
    /// </summary>
    public ObservableCollection<Item> ItemsForListBox { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        //подписываемся на событие загрузки окна
        this.Loaded += MainWindow_Loaded;
    }
    /// <summary>
    /// Событие загрузки окна
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        LoadLists();
        //делаем кодбихайнд источником данных для своего XAML
        this.DataContext = this;
    }
    /// <summary>
    /// Заполнение списков
    /// </summary>
    private void LoadLists()
    {
        ItemsForListView = new ObservableCollection<Item>()
        {
            new Item() { Key = 1, Value = "Значение 1"},
            new Item() { Key = 2, Value = "Значение 2"},
            new Item() { Key = 3, Value = "Значение 3"}
        };
        ItemsForListBox = new ObservableCollection<Item>();
    }
    /// <summary>
    /// Обработка события двойного клика мышью на ListView
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        if (SelectedItemInListView != null)
        {
            ItemsForListBox.Add(SelectedItemInListView);
        }
    }
}
    public class Item
    {
        public int Key { get; set; }
        public string Value { get; set; }
    }
}
Answer 2

Получилось вот так:

private int _SelectedIndexInListBox;
    public int SelectedIndexInListBox
    {
        get { return _SelectedIndexInListBox; }
        set
        {
            _SelectedIndexInListBox = value;
            PropertyChanged(this, new PropertyChangedEventArgs(nameof(SelectedIndexInListBox)));
        }
    }

И вывод:

<GridViewColumn Header="№"DisplayMemberBinding="{Binding SelectedIndexInListBox}">
<GridViewColumn.CellTemplate>
     <DataTemplate>
          <TextBlock Text="{Binding SelectedIndexInListBox}"></TextBlock>
     </DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>

Ничего не выводит, а если создаю отдельный ТекстБокс (за пределами ListView), то когда тыкаю мышкой по элементам ListView к которому привязан, значение выводится (индекс того элемента который я выбрал).

Два варианта вывода сделал потому что тестил, не работает ни 1 из вариантов :(

READ ALSO
Как получить название переменной в виде строки?

Как получить название переменной в виде строки?

Заранее прошу прощения если вопрос кому-то покажется глупым и бессмысленным, но для меня он имеет смыслНеобходима функция которая на входе...

308
Несколько баз данных Symfony 3

Несколько баз данных Symfony 3

Symfony 3Проект использует основную базу данных

407
Проблема с переменной или функцией

Проблема с переменной или функцией

Это bodyphp Для вывода всех строчек с масива отвечает функция getPosts, она же и задает в ссылке id

282
Синтаксическая ошибка в php: ParseError: &ldquo;syntax error, unexpected &#39;;&#39;&rdquo;

Синтаксическая ошибка в php: ParseError: “syntax error, unexpected ';'”

Пожалуйста подскажите, что означает ошибка:

336