Это больше вопрос реализации.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?Я хотел бы объявить только один раз и поделиться среди всех элементов управления.