.net - polymorphism for external package -
in project included external package control autocompletetextbox (https://wpfautocomplete.codeplex.com/).
i have on screen keyboard.
whenever user clicks on textbox, keyboard assigns keybord property has , each click on number adds number textbox.
some textbox must autocomplete , others must usual textbox.
the problem here autocompletetextbox doesn't inherits textbox, therefore cannot make unique "assign textbox" keyboard. both controls share property "text", need use.
public partial class keypad : usercontrol { private autocompletetextbox _controlasignado; //this should generic class or interface public keypad() { } public void asignarcontrol(autocompletetextbox control) { _controlasignado = control; } private void button_click(object sender, routedeventargs e) { button button = sender button; switch (button.commandparameter.tostring()) { case "back": if (_controlasignado.text.length > 0) _controlasignado.text = _controlasignado.text.remove(_controlasignado.text.length - 1); break; default: _controlasignado.text += button.content.tostring(); break; } }
}
it awesome have "itextbox" both controls implement.
i know can solve issue using reflection want elegant solution.
you can create wrapper both classes (preferably itextbox interface too), can abstract away differences , use runtime polymorphism:
interface itextbox { string text {get; set;} } abstract class textwrapper<t>: itextbox t: control { t wrapped; textwrapper(t textcontrol) { this.wrapped = textcontrol; } text{ get{ return wrapped.text; } set (string value) { wrapped.text = value; } } class textboxwrapper: textwrapper<textbox> {} class autocompletetextboxwrapper: textwrapper<autocompletetextbox> {}
your code this:
public partial class keypad : usercontrol { private itextbox _controlasignado; public keypad() { } public void asignarcontrol(autocompletetextbox control) { _controlasignado = new autocompletetextboxwrapper(control); } private void button_click(object sender, routedeventargs e) { button button = sender button; switch (button.commandparameter.tostring()) { case "back": if (_controlasignado.text.length > 0) _controlasignado.text = _controlasignado.text.remove(_controlasignado.text.length - 1); break; default: _controlasignado.text += button.content.tostring(); break; } } }
(i have not tested code, hope general idea looking for.)
Comments
Post a Comment