2015-06-24 2 views
1

У меня есть combobox, встроенный в ячейку сетки, которая впоследствии встроена в объект ListView. Когда окно загружается, combobox получает значения из моего списка классов контейнеров и заполняет combobox. Это прекрасно работает, но то, что Я хочу, чтобы иметь возможность определять индекс списка со списком при каждом событии SelectionChanged.wpf - Как найти строку ListView элемента в ячейке GridView?

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

Когда я искал это прежде, все результаты направлены на System.Windows.Forms.ListView в то время как я работаю с System.Windows.Controls.ListView, так m_ListView.Rows[index] не Работа.

В принципе, мне нужен способ получить индекс ListView или элемент, содержащий combobox, который вызывает 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, который дефолте в System.Windows.Controls для классов.

ответ

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> 

Codebehind:

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

Вот об этом. Повеселись!

+1

Большое спасибо! Получил его работу так, как я этого хочу. – OKUZA

Смежные вопросы