簡體   English   中英

wpf-如何在GridView單元格中找到元素的ListView行?

[英]wpf - How do I find the ListView row of an element in a GridView cell?

我在網格視圖單元格中嵌入了一個組合框,該組合框隨后又嵌入到ListView對象中。 加載窗口后,組合框從我的容器類列表中獲取值並填充組合框。 這工作正常,但我希望能在每次觸發SelectionChanged事件時確定組合框的listview索引。

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

當我之前進行搜索時,當我使用System.Windows.Controls.ListView時,所有結果都直接指向System.Windows.Forms.ListView,因此m_ListView.Rows[index]不起作用。

基本上,我需要一種獲取ListView索引或包含調用ComboBoxSelectionChanged的組合框的項目的方法(在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。

這是一個適合您的工作示例:

<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; }
}

就是這樣 玩得開心!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM