【问题标题】:wpf - How do I find the ListView row of an element in a GridView cell?wpf - 如何在 GridView 单元格中找到元素的 ListView 行?
【发布时间】:2015-06-24 20:08:06
【问题描述】:

我在网格视图单元格中嵌入了一个组合框,该单元格随后嵌入到 ListView 对象中。加载窗口时,组合框从我的容器类列表中获取值并填充组合框。这工作正常,但什么 我希望能够在触发 SelectionChanged 事件时确定组合框的列表视图索引。

<ComboBox x:Name="TransFileOpt" ItemsSource="{Binding ComboBoxOptions}" SelectedIndex="{Binding SelectedIndex}" SelectionChanged="ComboBoxSelectionChanged"/>

当我之前搜索过这个时,所有结果都指向 System.Windows.Forms.ListView,而我正在使用 System.Windows.Controls.ListView,所以 m_ListView.Rows[index] 不起作用。

基本上,我需要一种方法来获取包含调用 ComboBoxSelectionChanged 的​​组合框的 ListView 索引或项目(在触发 SelectionChanged 事件时)。

ListView 块:

    <ListView Name="m_ListView" ItemsSource="{Binding Tables}" Margin="0,28,0,132" SelectionMode="Extended" SelectedIndex="0" 
              RenderTransformOrigin="0.503,0.468" ScrollViewer.HorizontalScrollBarVisibility="Disabled"
              SelectionChanged="ListView_SelectionChanged">
        <ListView.View>
            <GridView x:Name="m_TableGridView" AllowsColumnReorder="False"  >
                <GridViewColumn Width="50" Header="Loaded">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox IsChecked="{Binding Loaded}"></CheckBox>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Width="150" Header="Master File" DisplayMemberBinding ="{Binding MasterFileName}"/>
                <GridViewColumn Width="200" Header ="Translation File" >
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox x:Name="TransFileOpt" ItemsSource="{Binding ComboBoxOptions}" 
                                      SelectedIndex="{Binding SelectedIndex}" SelectionChanged="ComboBoxSelectionChanged"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
        <ListView.Resources>
            <Style TargetType="{x:Type TextBlock}">
                <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=Text }"></Setter>
            </Style>
            <Style TargetType="ListViewItem">
                <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            </Style>
        </ListView.Resources>
    </ListView>

其他信息:该项目是通过 Visual Studio 的 wpf 编辑器生成的,该编辑器默认为 System.Windows.Controls 用于类。

【问题讨论】:

    标签: c# wpf listview


    【解决方案1】:

    这是一个适合您的工作示例:

    <Window x:Class="ListViewGridView.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ListView Margin="10" Name="lvUsers" ItemsSource="{Binding  items}">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Items" Width="150">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <ComboBox ItemsSource="{Binding containerItems}" SelectionChanged="ComboBox_SelectionChanged">
                                    <ComboBox.ItemTemplate>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding}"/>
                                        </DataTemplate>
                                    </ComboBox.ItemTemplate>
                                </ComboBox>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>
    

    代码隐藏:

    public partial class MainWindow : Window
    {
        public ObservableCollection<ItemContainer> items { get; set; }
    
        public MainWindow()
        {
            InitializeComponent();
            items = new ObservableCollection<ItemContainer>();
    
            items.Add(new ItemContainer() { containerItems = new List<string>() { "Item1", "Item2", "Item3" } });
            items.Add(new ItemContainer() { containerItems = new List<string>() { "Item4", "Item5", "Item6" } });
    
            this.DataContext = this;
        }
    
    
        public static T FindAncestorOrSelf<T>(DependencyObject obj)
            where T : DependencyObject
        {
            while (obj != null)
            {
                T objTest = obj as T;
    
                if (objTest != null)
                    return objTest;
    
                obj = VisualTreeHelper.GetParent(obj);
            }
            return null;
        }
    
        private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ListViewItem lvItem = FindAncestorOrSelf<ListViewItem>(sender as ComboBox);
            ListView listView = ItemsControl.ItemsControlFromItemContainer(lvItem) as ListView;
            int index = listView.ItemContainerGenerator.IndexFromContainer(lvItem);
            Console.WriteLine(index.ToString());
        }
    }
    

    还有简单的模型类:

    public class ItemContainer
    {
        public List<string> containerItems { get; set; }
    }
    

    就是这样。玩得开心!

    【讨论】:

    • 非常感谢!让它完全按照我的意愿工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多