Как я могу использовать коллекцию в строке элемента данных моей таблицы данных Windows Community Template в качестве источника элементов для столбца ComboBox в той же строке? - PullRequest
0 голосов
/ 24 марта 2020

Как я могу связать ItemsSource столбца Combobox с коллекцией, которая является подсвойством свойства в той же строке? Другими словами, DataGrid связан с коллекцией элементов класса, который содержит Property1 и Property2. Таким образом, DataGrid имеет два столбца, Property1 и Property2. Property1 имеет подчиненное свойство, которое является наблюдаемой коллекцией. Столбец для Property2 является столбцом Combobox, который должен использовать Observable Collection Property1 в качестве своего ItemsSource.

Я загружаю исходные данные сетки через EFCore. Я убедился, что использовал «.Include», чтобы убедиться, что Observable Collection Property1 загружается в память. Мне интересно, если проблема в том, что пользовательский интерфейс не знает, что Observable Collection Property1 был обновлен, когда он загружается из базы данных? Если это проблема, как я могу это исправить?

Мне нужно, чтобы эта коллекция служила Источником Items для столбца Property2, показанного ниже. Я попытался использовать относительный источник, чтобы получить текст данных сетки, но он не работает.

<wct:DataGridComboBoxColumn  Binding="{Binding Property2, Mode=TwoWay}"                                                
                             ItemsSource="{Binding Path=DataContext.Property1.MyCollection, 
                             RelativeSource={RelativeSource TemplatedParent}, 
                             Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">

Я также пробовал это:

ItemsSource="{Binding ElementName=grid, 
              Path=DataContext.Property1.MyCollection}"

Спасибо.

1 Ответ

0 голосов
/ 25 марта 2020

Получите официальный метод обработки , лучший способ установлен в коде 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;
        }
    }
}
...