WPF DataGridComboBoxColumn привязка - PullRequest
       10

WPF DataGridComboBoxColumn привязка

0 голосов
/ 02 сентября 2018

У меня возникли проблемы при попытке использовать DataGridComboBoxColumn для обновления моей структуры сущности

У меня есть сетка данных, которую я привязываю к пользовательской модели (FunctionPrinterLookupModel), которая в основном представляет собой поиск между принтерами и функциями вокруг здания. Все функции статичны, но я бы хотел, чтобы пользователи могли выбирать, какой принтер они используют для этой функции.

<DataGrid Grid.Row="1" x:Name="gridLookup" AutoGenerateColumns="False" Width="500" RowEditEnding="gridLookup_RowEditEnding" Margin="20">
                    <DataGrid.DataContext>
                        <Models:Printer/>
                    </DataGrid.DataContext>
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Function" Width="*" IsReadOnly="True" Binding="{Binding FunctionName}"/>
                        <!--<DataGridTextColumn Header="Printer" Width="*" Binding="{Binding PrinterName, UpdateSourceTrigger=PropertyChanged}"/>-->
                        <DataGridComboBoxColumn x:Name="ddlPrinters" Header="Printer" Width="*"  SelectedValueBinding="{Binding PrinterID, Mode=TwoWay}" SelectedValuePath="{Binding PrinterID, Mode=TwoWay}" DisplayMemberPath="{Binding PrinterName}"/>
                    </DataGrid.Columns>
                </DataGrid>

 private void gridPrinters_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
    {
        if (e.EditAction == DataGridEditAction.Commit)
        {
            Printer printer = (Printer)e.Row.Item;
            if (printer.PrinterID != 0)
            {
                Printer printerDB = context.Printers.Where(s => s.PrinterID == printer.PrinterID).Single();
                printerDB.PrinterName = printer.PrinterName;
                context.SaveChanges();
            }
            else
            {
                Printer newPrinter = new Printer()
                {
                    PrinterName = printer.PrinterName
                };
                context.Printers.Add(newPrinter);
                context.SaveChanges();
            }
        }

        RefreshPrintersGrid();
    }

Я связываю DataGridComboBoxColumn в коде с моделью EF, содержащей список принтеров.

Когда значение выбрано и мы запускаем функцию RowEditEnding, значение комбинированного списка не обновляется в модели FunctionPrinterLookupModel. Я чувствую, что завязываю себя здесь узлами и не смог найти решение, которое работает с моих часов поиска в Google. Может ли кто-нибудь помочь мне разобраться?

1 Ответ

0 голосов
/ 02 сентября 2018

Было бы лучше привязать источник элементов комбинированного списка к свойству в вашей ViewModel. Затем привяжите выбранный принтер и в ViewModel выполните действие при изменении свойства.

<DataGridComboBoxColumn x:Name="ddlPrinters" Header="Printer" Width="*" ItemsSource="{Binding PrinterList}"  SelectedItem="{Binding SelectedPrinter, Mode=TwoWay}" SelectedValuePath="PrinterID" DisplayMemberPath="PrinterName"/>

В ViewModel

Private PrinterInfo _SelectedPrinter { get; set; }

Publuc PrinterInfo SelectedPrinter 
{
    get
    {
        return _SelectedPrinter;
    }  
    set
    {
        _SelectedPrinter = value;
        //save value to db or other actions
    }  
}
...