Обновить автоматически созданный элемент комбинированной ячейки таблицы данных при открытии окна

У меня есть сетка данных, связанная с коллекцией объектов. одно из моих свойств объекта используется в качестве индекса в коллекции. В автоматически создаваемом столбце комбинированного списка "Тип" отображается "метка", связанная с этим индексом.

Этот выпадающий список обновляет другое свойство, которое также является индексом в том же объекте.

Источник элемента комбинированного списка "Тип" представляет собой словарь: cbTypeVals

Источниками элемента "Связывание" в выпадающем списке являются словари: cbSrcValueVals и cbDiagVals

Вот код:

  public partial class LedTableEditor : MetroWindow, INotifyPropertyChanged
  {
    private object _sender;
    private Dictionary<int, string> cbTypeVals = new Dictionary<int, string>();
    private Dictionary<UInt16, string> cbSrcValueVals = new Dictionary<UInt16, string>();
    private Dictionary<UInt16, string> cbDiagVals = new Dictionary<UInt16, string>();

    private List<string> ListeData = new List<string>();
    private List<string> ListeDiag = new List<string>();

    private System.Collections.IEnumerable _source;
    public System.Collections.IEnumerable Source
    {
        get { return _source; }
        set { _source = value; OnPropertyChanged(); }
    }


    public LedTableEditor(object senderParam)
    {
         InitializeComponent();
        _sender = senderParam;
        DgLedTable.ItemsSource = (_sender as MainWindow)._document.Config.ListeLedTable.ListeLedTable;

        cbTypeVals.Add(0, eLedType.ALERTE.ToString());
        cbTypeVals.Add(1, eLedType.DIAG.ToString());
        cbTypeVals.Add(2, eLedType.TRIGGER.ToString());

        ListeData = (_sender as MainWindow)._document.Config.ListeDataTable.ListeDataTable.Select(x => x.Name).ToList();
        if (ListeData.Find(x => x == "OFF") == null) ListeData.Insert(0, "OFF");
        foreach (string s in ListeData) if(s != "") cbSrcValueVals.Add((UInt16)ListeData.IndexOf(s), s);

        ListeDiag = (_sender as MainWindow)._document.Config.ListeDiagTable.ListeDiagTable.Select(x => x.Name).ToList();
        if (ListeDiag.Find(x => x == "OFF") == null) ListeDiag.Insert(0, "OFF");
        foreach (string s in ListeDiag) if (s != "") cbDiagVals.Add((UInt16)ListeDiag.IndexOf(s), s);

        if (this.DgLedTable.Items.Count > maxLeds) this.DgLedTable.CanUserAddRows = false;
        DgLedTable.Visibility = Visibility.Visible;

        _source = cbSrcValueVals;
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    private void OnComboBoxSelectionChanged(object sender, SelectionChangedEventArgs e)
    {
       // DgLedTable.CurrentCell = new DataGridCellInfo(DgLedTable.SelectedIndex, DgLedTable.Columns[1]);
        Source = cbDiagVals;
    }

    private void DgLedTable_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        if (e.PropertyName == "Type")
        {
            DataGridComboBoxColumn cbType = new DataGridComboBoxColumn();
            cbType.EditingElementStyle = new Style(typeof(ComboBox))
            {
                Setters =
                {
                    new EventSetter(Selector.SelectionChangedEvent, new SelectionChangedEventHandler(OnComboBoxSelectionChanged))
                }
            };

            e.Column = cbType;
            cbType.ItemsSource = cbTypeVals; // new List<string> { eLedType.ALERTE.ToString(), eLedType.DIAG.ToString(), eLedType.TRIGGER.ToString() };
            cbType.DisplayMemberPath = "Value";
            cbType.SelectedValuePath = "Key";
            cbType.SelectedValueBinding = new Binding("Type");
            e.Column.Header = "Type";
            e.Column.CellStyle = new Style(typeof(DataGridCell));
            e.Column.CellStyle.Setters.Add(new Setter(DataGridCell.HorizontalAlignmentProperty, HorizontalAlignment.Stretch));

        }

        if (e.PropertyName == "Binding")
        {
            DataGridComboBoxColumn cbBinding = new DataGridComboBoxColumn();
            BindingOperations.SetBinding(cbBinding, DataGridComboBoxColumn.ItemsSourceProperty, new Binding("Source") { Source = this });

            e.Column = cbBinding;
            cbBinding.ItemsSource = cbSrcValueVals;
            cbBinding.DisplayMemberPath = "Value";
            cbBinding.SelectedValuePath = "Key";
            cbBinding.SelectedValueBinding = new Binding("Binding");
            e.Column.Header = "Binding";
            e.Column.CellStyle = new Style(typeof(DataGridCell));
            e.Column.CellStyle.Setters.Add(new Setter(DataGridCell.HorizontalAlignmentProperty, HorizontalAlignment.Stretch));
        }
----
   }

Когда событие SelectionChange со списком "Тип" инициируется, я обновляю "Связывание" элемента со списком источник:

private void OnComboBoxSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if ((sender as ComboBox).SelectedIndex == 1)
       Source = cbDiagVals;
    else
       Source = cbSrcValueVals;
}

Все работает нормально, когда я меняю выбор ComboBox "Тип", но мне нужно обновлять каждый комбинированный "Тип", когда я открываю Таблицу Светодиодов, по умолчанию для "Source" установлено значение cbSrcValueVals в ctor.

Спасибо.

Ссылка на оригинальный вопрос: Как программно обновить источник элементов в автоматически сгенерированной ячейке комбинированного списка данных

0 ответов

Другие вопросы по тегам