Получите официальный метод обработки , лучший способ установлен в коде DataGridComboBoxColumn
. Дайте DataGridComboBoxColumn
имя тега и найдите столбец с тегом, как показано ниже, затем установите DataGridComboBoxColumn
ItemsSource
.
MyCollection = new List<string> { "DD", "FF", "CC" };
var comboBoxColumn = MyDataGrid.Columns.FirstOrDefault(x => x.Tag.Equals("Link")) as DataGridComboBoxColumn;
if (comboBoxColumn != null)
{
comboBoxColumn.ItemsSource = MyCollection;
}
MyDataGrid.ItemsSource = items;
Код Xaml
<controls:DataGridComboBoxColumn
Width="*"
Binding="{Binding p2}"
Header="Link"
Tag="Link"
/>
DataGridComboBoxColumn
Свойство ItemsSource не может напрямую получить доступ к под-свойству источника данных, поэтому нам нужно создать свойство списка для страницы. класс, который используется для хранения Property1.MyCollection
. Если вы уже настроили MyCollection для класса Page, вы также можете использовать x: bind для доступа следующим образом.
<controls:DataGridComboBoxColumn
Width="*"
Binding="{Binding p2}"
Header="Link"
ItemsSource="{x:Bind MyCollection,Mode=OneWay}"
Tag="Link"
/>
Обновление
Если свойство1. MyCollection не является постоянным списком, вы можете попробовать использовать DataGridTemplateColumn
пользовательскую ячейку столбца и связать источник данных, как показано ниже:
<controls:DataGridTemplateColumn>
<controls:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
ItemsSource="{Binding p1.Mycollection, Mode=OneWay}"
SelectionChanged="ComboBox_SelectionChanged"
/>
</DataTemplate>
</controls:DataGridTemplateColumn.CellEditingTemplate>
<controls:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock
Margin="10"
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
Text="{Binding p2, Mode=OneWay}"
/>
</DataTemplate>
</controls:DataGridTemplateColumn.CellTemplate>
</controls:DataGridTemplateColumn>
Код позади
public class P1
{
public string Name { get; set; }
public List<string> Mycollection { get; set; }
}
public class ITPP
{
public P1 p1 { get; set; }
public string p2 { get; set; }
}
private void CreateDataSource()
{
items = new List<ITPP>();
items.Add(new ITPP { p1 = new P1 { Name = "FirstP1", Mycollection = new List<string>() { "AA", "BB", "CC", "DD" } }, p2 = "CC" });
items.Add(new ITPP { p1 = new P1 { Name = "SecondP1", Mycollection = new List<string>() { "EE", "FF", "GG", "HH" } }, p2 = "HH" });
items.Add(new ITPP { p1 = new P1 { Name = "ThirdP1", Mycollection = new List<string>() { "II", "JJ", "KK", "LL" } }, p2 = "LL" });
MyDataGrid.ItemsSource = items;
}
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var mycombobox = sender as ComboBox;
var p1collection = mycombobox.ItemsSource;
foreach (var item in items)
{
if (item.p1.Mycollection == p1collection)
{
item.p2 = mycombobox.SelectedItem as string;
}
}
}