Общие методы загрузки ленты, выпадающего списка и выпадающего списка - PullRequest
0 голосов
/ 08 февраля 2020

У меня есть интерфейс на основе ленты, в котором есть один выпадающий список и один выпадающий список. Я создал следующие методы для загрузки этих элементов управления с содержимым:

Для комбинированного списка:

        internal void LoadComboBox(RibbonComboBox YourCbx, List<string> YourList)
        {
            if (YourCbx.Items.Count > 0)
                YourCbx.Items.Clear();
            foreach (var curEntry in YourList.ToArray())
            {
                RibbonDropDownItem newItem = Factory.CreateRibbonDropDownItem();
                newItem.Label = curEntry ;
                YourCbx.Items.Add(newItem);
            }
        }

Для выпадающего списка:

        internal void LoadDDBox(RibbonDropDown YourDD, List<string> YourList)
        {
            if (YourDD.Items.Count > 0)
                YourDD.Items.Clear();
            foreach (var curEntry in YourList.ToArray())
            {
                RibbonDropDownItem newItem = Factory.CreateRibbonDropDownItem();
                newItem.Label = curEntry ;
                YourDD.Items.Add(newItem);
            }

        }

Как вы можете видеть оба метода в значительной степени идентичны, за исключением того, что в метод необходимо передать другой объект управления windows. Поэтому я подумал о создании одного метода для обоих элементов управления и дошел до следующего:

        internal void LoadDropDown<T>(IList<T> YourDD, List<string> YourList, Action<RibbonDropDownItem> addMeth)
        {
            if (YourDD.Count > 0)
                YourDD.Clear();
            foreach (var curCS in YourList.ToArray())
            {
                RibbonDropDownItem newItem = Factory.CreateRibbonDropDownItem();
                newItem.Label = curCS;
                addMeth(newItem);
            }

        }

Вызов этого метода может выглядеть следующим образом:

LoadDropDown<RibbonDropDown>((IList<RibbonDropDown>)MyDropDownControl, MyList,
                             (x) => { MyDropDownControl.Items.Add(x); });

К сожалению, Я получаю исключение во время выполнения о том, что RibbonDropDown не может быть преобразован в IList. Я сейчас застрял здесь. У кого-нибудь есть предложения как сделать один метод как выше?

Ответы [ 2 ]

0 голосов
/ 09 февраля 2020

К сожалению, идея ссылаться на общий базовый класс не была плодотворной, поскольку и RibbonDropDown, и RibbonComboxBox являются интерфейсами в пространстве имен Microsoft.Office.Tools.Ribbon, а не классами.

Но у меня есть сейчас наконец нашел правильное решение. При взгляде на элементы Items обоих интерфейсов в VS видно, что оба реализуют IList<RibbonDropDownItem>. Таким образом, правильный метод теперь выглядит следующим образом:

internal void LoadDropDown(IList<RibbonDropDownItem> YourDD, List<string> YourList)
{
    if (YourDD.Count > 0)
        YourDD.Clear();
    foreach (var curCS in YourList.ToArray())
    {
        RibbonDropDownItem newItem = Factory.CreateRibbonDropDownItem();
        newItem.Label = curCS;
        YourDD.Add(newItem);
    }
}

и вызов этого метода теперь выглядит следующим образом (и работает!):

LoadDropDown((IList<RibbonDropDownItem>)MyDropDownControl.Items, MyList);

В любом случае спасибо за вдохновение, чтобы найти правильное решение!

0 голосов
/ 08 февраля 2020

Вы можете переписать свой метод так:

      internal void LoadDropDown<T>(T YourDD, List<string> YourList, Action<RibbonDropDownItem> addMeth) where T : (AnyBaseTypeForRibbonItems)
        {
            if (YourDD.Items.Count > 0)
               YourDD.Items.Clear();
            foreach (var curCS in YourList.ToArray())
            {
                RibbonDropDownItem newItem = Factory.CreateRibbonDropDownItem();
                newItem.Label = curCS;
                addMeth(newItem);
            }

        }

И использовать его так:

LoadDropDown<RibbonDropDown>(MyDropDownControl, MyList,
                             (x) => { MyDropDownControl.Items.Add(x); });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...