循环遍历WPF ListView的第二列,并在每行中检索ComboBox的值

时间:2015-12-12 03:02:29

标签: wpf listview gridview combobox listbox

我在第一列中有一个带有CheckBoxes的两列ListView,在第二列中有一个ComboBoxes。我需要遍历第二列中的ComoboBoxes并从每个ComboBox中检索选定的值(或索引),以及ComboBox的一些索引或标识符,并将值放入数组中。例如,布局如下所示:

COLUMN 1  COLUMN 2
========  ========
ChBx 1    Combo1
ChBx 2    Combo2

我需要获取第二列中每个ComboBox的SelectedValue或SelectedIndex,并按正确的顺序将其放入一个数组中。但是,我在互联网上发现的是使用:myListView.Items(0).SubItems(1).Text,循环遍历第二列。但是,我的第二列包含一个ComboBox,我想要它的'值(不是一些Text属性)。有任何想法吗?我的XAML标记在下面。

            <ListView IsSynchronizedWithCurrentItem="True" Margin="0,0,10,10" Name="patternList" Height="139" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="112" BorderBrush="{x:Null}" BorderThickness="1" Background="White" >
                 <ListView.View>
                    <GridView>
                        <GridView.Columns>
                            <GridViewColumn Header="Pattern">
                                <GridViewColumn.CellTemplate>
                                    <DataTemplate>
                                        <CheckBox Content="{Binding outContent}" 
                                                  ToolTip="{Binding outToolTip}"
                                                  IsThreeState="False"
                                                  IsChecked="{Binding Path=outIsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                                    </DataTemplate>
                                </GridViewColumn.CellTemplate>
                            </GridViewColumn>
                            <GridViewColumn Header="Freq" Width="55">
                                <GridViewColumn.CellTemplate>
                                    <DataTemplate>
                                        <ComboBox HorizontalContentAlignment="Center" 
                                                  Height="14" 
                                                  Padding="0" 
                                                  SelectionChanged="FrequencyChanged_OnSelectionChanged"
                                                  FontSize="10">
                                            <ComboBoxItem Content="0%"/>
                                            <ComboBoxItem Content="10%"/>
                                            <ComboBoxItem Content="20%"/>
                                            <ComboBoxItem Content="30%"/>
                                            <ComboBoxItem Content="40%"/>
                                            <ComboBoxItem Content="50%"/>
                                            <ComboBoxItem Content="60%"/>
                                            <ComboBoxItem Content="70%"/>
                                            <ComboBoxItem Content="80%"/>
                                            <ComboBoxItem Content="90%"/>
                                            <ComboBoxItem Content="100%"/>
                                        </ComboBox>
                                    </DataTemplate>
                                </GridViewColumn.CellTemplate>
                            </GridViewColumn>
                        </GridView.Columns>
                    </GridView>
                </ListView.View>
   </ListView>

2 个答案:

答案 0 :(得分:0)

从我的角度来看,最好在列表项视图模型中为组合框生成项目,并绑定到该视图模型中的选定项目。下面是说明方法的代码。

XAML

<Window x:Class="ComboboxesInGrid.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ComboboxesInGrid"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <local:MainWindowViewModel />
    </Window.DataContext>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="30"/>
        </Grid.RowDefinitions>
        <ListView IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding ListItems}" Margin="0,0,10,10" Name="patternList" BorderBrush="{x:Null}" BorderThickness="1" Background="White" >
            <ListView.View>
                <GridView>
                    <GridView.Columns>
                        <GridViewColumn Header="Pattern" Width="100">
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <CheckBox Content="{Binding outContent}" 
                                                  ToolTip="{Binding outToolTip}"
                                                  IsThreeState="False"
                                                  IsChecked="{Binding Path=outIsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                        <GridViewColumn Header="Freq" Width="155">
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <ComboBox HorizontalContentAlignment="Center" 
                                                  Height="14" 
                                                  Padding="0" 
                                                  SelectedItem="{Binding outComboSelected}"
                                                  ItemsSource="{Binding outComboValues}"
                                                  FontSize="10">

                                    </ComboBox>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                    </GridView.Columns>
                </GridView>
            </ListView.View>
        </ListView>
        <TextBlock Grid.Row="1" Text="{Binding SelectedComboItems}" />
    </Grid>
</Window>

C#

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;


namespace ComboboxesInGrid
{
    public class MainWindowViewModel : ViewModelBase
    {
        private ObservableCollection<ListItemViewModel> _listItems = new ObservableCollection<ListItemViewModel>();

        public string SelectedComboItems
        {
            get { return String.Join(",", _listItems.Select(li => $"{li.outContent}-{li.outIsChecked}-{li.outComboSelected}")); }
        }

        public ObservableCollection<ListItemViewModel> ListItems
        {
            get { return _listItems; }
            set { _listItems = value; OnProperyChanged(); }
        }

        public MainWindowViewModel()
        {
            AddListItem(new ListItemViewModel() { outContent = "ChBx 1 ", outToolTip="Tooooool", outIsChecked = false, outComboSelected="30%" });
            AddListItem(new ListItemViewModel() { outContent = "ChBx 2 ", outComboSelected = "70%" });

        }

        private void AddListItem(ListItemViewModel item)
        {
            item.PropertyChanged += (s, e) => OnProperyChanged(nameof(SelectedComboItems));
            _listItems.Add(item);
        }
    }

    public class ListItemViewModel : ViewModelBase
    {
        private string _outContent;

        public string outContent
        {
            get { return _outContent; }
            set { _outContent = value; OnProperyChanged(); }
        }


        private string _outToolTip;
        public string outToolTip
        {
            get { return _outToolTip; }
            set { _outToolTip = value; OnProperyChanged(); }
        }

        private bool? _outIsChecked;
        public bool? outIsChecked
        {
            get { return _outIsChecked; }
            set { _outIsChecked = value; OnProperyChanged(); }
        }

        private string _outComboSelected;
        public string outComboSelected
        {
            get { return _outComboSelected; }
            set { _outComboSelected = value; OnProperyChanged(); }
        }

        public IEnumerable<string> outComboValues
        {
            get
            {
                return Enumerable.Range(0, 11).Select(i => $"{i*10}%");
            }
        }
    }

    public class ViewModelBase : INotifyPropertyChanged
    {
        protected void OnProperyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        public event PropertyChangedEventHandler PropertyChanged;

    }
}

答案 1 :(得分:0)

SelectedValue绑定到ViewModel中的属性。在该属性的Setter中,也更新集合。

第二种方法,在FrequencyChanged_OnSelectionChanged事件处理程序中。您也可以继续更新您的收藏。