Передача делегатов элементам управления, созданным во время выполнения - PullRequest
0 голосов
/ 21 января 2011

Это больше вопрос реализации.MainWindow имеет объект последовательного порта, который предоставляет метод SendData (byte [] data).MainWindow также имеет элемент управления вкладками, который заполняется во время выполнения через внешний XML-файл.Эти элементы управления взаимодействуют с последовательным портом, получая и отправляя данные.

Для отправки пользователь может нажать «Отправить», и ему нужно вызвать MainWindow.SendData ().Вопрос в том, как сделать вызов элемента управления MainWindow.SendData () без ссылки на MainWindow (я мог бы переместить SendData () в другой класс и т. Д.).

class MainWindow {
    SerialPort serialport;
    public MainWindow {
        // parse XML and add tabs to tabcontrol
        int tabcount = xmlreader.GetNodeCount(xpath);
        for (int i = 0; i<tabcount; i++) {
        tabitems[i] = new TabClass(tabname, ref tabControl);
    }
    public void SendData(byte[] data){
        serialport.Write(data,0,data.Length);
    }
}

class TabClass {
    TabItem tabitem;
    public TabClass(tabname, ref tabControl){
        tabitem = new TabItem();
        tabcontrol.Items.Add(tabitem);
        // add all controls (coming from xml)
        for (int i = 0; i < nrControls; i++) {
            // add control here, i.e. CommandControl
        }
    }
}    
class CommandControl {
    public Button_Click(){
        // Need to call SendData here!!
    }
}

Первое, что приходит на ум, этопередайте делегат SendData в TabClass, затем пусть TabClass передаст делегат каждому добавляемому пользовательскому элементу управления.Я мог бы пройти через каждый конструктор класса или сделать делегатов открытыми, и MainWindow мог бы писать напрямую в них.

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

Вопрос: есть ли другой способ выставить делегат SendData () из MainWindow?без ссылки на MainWindow?Я хотел бы объявить только один раз и поделиться среди всех элементов управления.

Ответы [ 2 ]

1 голос
/ 21 января 2011

Вы можете использовать класс Singleton или просто статический класс.

Это должно совпадать с наличием ровно одного выходного канала, что выглядит так.

0 голосов
/ 21 января 2011

Для этого вам не нужен делегат.
Класс помощника пользователя.

class SerialWrapper {
    SerialPort serialport;  
    public void SendData(byte[] data){
        serialport.Write(data,0,data.Length);
    }
}

class MainWindow {
    SerialWrapper serialWrapper;
    public MainWindow {
        // parse XML and add tabs to tabcontrol
        int tabcount = xmlreader.GetNodeCount(xpath);
        for (int i = 0; i<tabcount; i++) {
        tabitems[i] = new TabClass(tabname, ref tabControl,serialWrapper);
    }
    public void SendData(byte[] data){
        serialWrapper.SendData(data);
    }
}

обновление:

class CommandControl {
    public CommandControl(SerialWrapper serialWrapper)
    {
          this.serialWrapper=serialWrapper;
    }

    public Button_Click(){
        serialWrapper.SendData();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...