我目前有一个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方法的解决方案。
答案 0 :(得分:1)
如果您使用Customer
和Name
属性创建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
集合