如何为DataGridTemplate中的每个Combobox更改/预填充SelectedIndex?

时间:2015-05-05 19:33:30

标签: c# wpf xaml datagrid combobox

我目前有一个DataGrid,它有2列,其中一列是DataGridTextColumn,它将显示ObservableCollection字符串中的项目,第二列是DataGridTemplateColumn,它包含DataGridCellTemplate,其中包含显示Combobox的DataTemplate。组合框也绑定到ObservableCollection字符串。一切都应该绑定和显示。

我想要实现的目标是,由于需求的变化和功能的增加,我需要更改Combobox中显示的默认条目的索引(目前索引0)。我有一个新的字典,其中包含第一列中的条目作为键,值是第二列(组合框)中存在的字符串。

:如何更改第二列中某些广告系列的selectedIndex为'预先选择'从字典中获取已知条目的索引?

最小,完整,可验证的示例:

我现在有什么:

+--------------+-------------------+
| CustomerName |     Location      |
+--------------+-------------------+
| Bob          | <Select Location> |   <-- these are comboboxes
| John         | <Select Location> |
| Katy         | <Select Location> |
+--------------+-------------------+

XAML:

<DataGrid x:Name="CustomerLocationGrid" Height="265" VerticalAlignment="Center" Margin="-7,8,-2,-6" ItemsSource="{Binding CustomerNameList}" AutoGenerateColumns="False"> 
 <DataGrid.Columns>
     <DataGridTextColumn x:Name="customerDisplayList" Header="CustomerName" MinWidth="500" IsReadOnly="True"  Binding="{Binding Path=., Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" DisplayIndex="0"/>
     <DataGridTemplateColumn x:Name="networkTypeTemplateColumn" Header="Location" MinWidth ="200" CanUserResize="True" Width="*">
           <DataGridTemplateColumn.CellTemplate>
                 <DataTemplate>
                     <ComboBox x:Name="locationCombobox"  ItemsSource="{Binding locationList, RelativeSource={RelativeSource AncestorType=UserControl}}" SelectedIndex="0" SelectionChanged="locationCombobox_SelectionChanged"/>
                 </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
     </DataGridTemplateColumn>
   </DataGrid.Columns>

其中:

public ObservableCollection<String> CustomerNameList { get; set; }    //has a collection of Bob, John, Katy
public ObservableCollection<string> locationList { get; set;}   //has locations like Minnesota, Iowa, New York

(列表来自不同的来源)

注意上面的DataTemplate-Combobox XAML是我从this tutorial on WPF comboboxes学到的(名为&#34;有史以来最好的WPF组合框教程&#34;)

我是如何从另一个来源Dictionary<string,string>Bob -> Minnesota获得第三个John -> Iowa,但凯蒂不在那里,因为它无法预先确定且用户需要手动选择位置。

我想自动选择组合框内的索引,以便表格如此,或者更改Bob和Johns的位置:

+--------------+-------------------+
| CustomerName |     Location      |
+--------------+-------------------+
| Bob          | Minnesota         | <-- set as the displayedIndex
| John         | Iowa              |
| Katy         | <Select Location> |
+--------------+-------------------+

我尝试过的内容: 我的方法是遍历每个CustomerName条目,在字典中查找,如果从字典返回值,则设置位置。字符串都是相同的,因此不需要匹配。

  • 以编程方式遍历DataGridTemplateColumn以获取每个组合框并设置selectedIndex,但未能获得每个客户组合框的索引以及客户名

  • 尝试使用Initialized事件处理程序(灵感来自this answer)来使用对象(使用sender as ComboBox转换,但无法获取索引)。

我还尝试使用像getting the index with VisualTreeHelper这样的相关解决方案,但觉得它太复杂了(也无法获得父级)以及其他一些基于VisualTreeHelper方法的解决方案。

1 个答案:

答案 0 :(得分:1)

如果您使用CustomerName属性创建Location ViewModel类并创建ObservableCollection<Customer> customers并将其设置为{{1>,那将很容易对于datagrid并使用它来绑定列。

ItemsSource

使用public class Customer { public string Name {get; set;} public string Location {get; set;} } ObservableCollection<Customer> customers = new ObservableCollection<Customer>(); 和相应的customers

中的名称填充CustomerNamesList集合
locationList

在XAML中创建名为foreach(var customer in CustomerNameList ) { string location = string.Empty; //ThirdList is your Dictionary<string, string> if(ThirdList.Contains(customerName)) // Get customer location location = ThirdList[customerName]; customers.Add(new Customer{Name=cusotmerName, Location=location}); } 的{​​{1}}并将其绑定到数据网格CollectionViewSource

CustomerViewSource

在Code背后,将ItemsSource设置为<UserControl.Resources> <CollectionViewSource x:Key="CustomerViewSource"/> </UserControl.Resources>

CustomerViewSource.Source

在XAML中,将ObservableCollection<Customer> customers的绑定设置为CollectionViewSource CustomerViewSource = this.Resources["CustomerViewSource"] as CollectionViewSource; CustomerViewSource.Source = customer; 集合的DataGridTextColumn属性,并将Name的绑定设置为{ {1}}

customers

现在,您的数据网格将显示所有预先填充的客户信息,对于没有位置信息的用户信息,用户可以选择该信息,您可以在ComboBox.SelectedItem集合

中检索它